2013-12-17 25 views
27

Yaptığım yöntemin doğru olup olmadığından emin değilim, herhangi bir öneri takdir edilecektir.Belirli bir stateParam boşsa durumu bildirme

Kullanıcının bir restoranı seçebileceği bir Restoran Seçici var. Daha sonra diğer tüm çocuk devletleri seçilen restorana özel içerik yükler. Ancak, bir restoran da dahil olmak üzere, varsayılan olarak seçilen bir çocuk durumunun olması gerekir. Bunlar, en yakın konumdaki kullanıcılara veya daha önce bir tane seçtiyseniz çerez verilerine dayanarak seçilir. Ancak, restoran kimliğini zaten bilmeden varsayılan olarak bir çocuk durumuna nasıl yönlendirebileceğimi bilmiyorum?

Aşağıdaki şekilde kodumun bastardised sürümü gösteriliyor.

app.config(function ($stateProvider, $urlRouterProvider) { 
$urlRouterProvider.otherwise("/restaurant/[some id based on cookie info]/our-food"); // if no id is set, then I want to get it from a cookie, but then how do i do the redirect? 

$stateProvider 
    .state('restaurant', { 
     url: '/restaurant/:restaurantId', 
     template: "<ui-view/>", 
     controller: function($state, $stateParams, Data, RestaurantService, $cookieStore) { 
      if(typeof $stateParams.restaurantId !== 'undefined') { 
            // get the restaurantID from the cookie 
          } 
     } 
    }) 
    .state('restaurant.our-food', { 
     url: '/our-food', 
     templateUrl: function($stateParams) { 
     return 'templates/food-food.html?restaurantId=' + $stateParams.restaurantId; 
     }, 
    controller: 'SubNavCtrl' 
    }) 
    .state('restaurant.glutenfree-vegetarian', { 
     url: '/glutenfree-vegetarian', 
     templateUrl: function($stateParams) { 
    return 'templates/food-vegetarian.html?restaurantId=' + $stateParams.restaurantId; 
     }, 
    controller: 'SubNavCtrl' 
    }) 

aşağıda bir görüntü ön ucunda neler olduğunu göstermek için: www.merrywidowswine.com/ss.jpg

cevap

37

ben belirli devlet olduğunu her açtığınızda ateşlendiğinde bir olay yaratacak.

Kontrol dışarı onların doc: https://github.com/angular-ui/ui-router/wiki#onenter-and-onexit-callbacks

Yani benim tahminim ben hiç kullanmadım (önerilir) restoran durumuna

$stateProvider.state("contacts", { 
    template: '<ui-view>', 
    resolve: ..., 
    controller: function($scope, title){ 
    }, 
    onEnter: function(){ 
    if(paramNotSet){ $state.go(...)} 
    } 
}); 

bu

1. OnEnter callback'inde gibi bir şey ya olduğu kendim gibi bir olay çözmek için bazı jimnastik yapmak zorunda kalabilirsiniz, ama bunun en temiz, en kolay anlaşılır ve en sürdürülebilir çözüm olduğuna inanıyorum.

2 Küresel onStateChangeStart Alternatif başladı gibi denetleyici kullanmak isterseniz kontrolörü olarak olay (bu her durum değişikliği için kovulacağım olsa da) Küresel bir olay

$rootScope.$on('$stateChangeStart', 
function(event, toState, toParams, fromState, fromParams){ ... //check cookie, change state etc ...}) 

3 yapıyor.

controller: ['$state', '$stateParams', 'Data', 'RestaurantService', '$cookieStore', 
function($state, $stateParams, Data, RestaurantService, $cookieStore) { 
    if(typeof $stateParams.restaurantId !== 'undefined') { 
     sate.go('restaurant', $cookieStore['restaurant']) 
    } 
}] 

Bu muhtemelen gelişim açısından en hızlı çözümdür ama olayları kullanarak daha temiz ve daha anlaşılır kodu için yapar inanıyoruz.

Not: Aslında bu kodlardan hiçbirini çalıştırmadım, bu yüzden işe yaramayabilir, yalnızca nereye gideceğiniz hakkında bir fikir vermek için sözde koddur. Sorun yaşarsan haberim olsun.

EDIT: Kesin olarak, stateParams'ın denetleyiciye iletildiğinden emin değilim. Onlara erişmek için çözmek zorunda kalabilirsiniz.

DÜZENLEME: OnEnter callback'inde ya da kontrolöre stateParams erişmek için, sana gibi kararlılığını kullanmak zorunda inanıyoruz:

resolve: { 
     checkParam: ['$state','$stateParams', '$cookieStore', function($state, $stateParams, $cookieStore) { 
//logic in here, what it returns can be accessed in callback or controller. 
     }] 

/Daha fazla örnek için kararlılıkla daha iyi bir açıklama ui-yönlendirici belgeye bakın

.state('restaurant', { 
    url: '/restaurant/:restaurantId', 
    template: "<ui-view/>", 
    onEnter: function ($state, $stateParams, $cookies) { 
     console.log($stateParams.restaurantId); 
     if (!$stateParams.restaurantId) { 
     $stateParams.restaurantId = $cookies.restaurantId; 
     $state.go('restaurant.restaurantID'); 
     } 
    }, 
}) 

I:

+0

Teşekkürler, bu bana doğru yönde işaret ediyor, ben bir oyuna sahip olacağım ve çalışıp çalışamayacağımı göreceğim. Şerefe! –

+1

# 1 çözümünüzle karşılaştığınız sorun, tüm çözümleme özelliklerinin "onEnter" gerçekleştirilmeden önce çözülmesidir. Github ile ilgili bir sorun başlattım: https://github.com/angular-ui/ui-router/issues/1102. Yeniden yönlendirmeden önce çözümlenmiş paramların çözülmesini istemiyorsanız (örneğin, rota belirli bir parametre gerektiriyorsa) kısa devre için gizli bir kanca olup olmadığından emin değilim. – Beez

+0

'$ state.transitionTo' yerine, burada belirtildiği gibi' $ state.go' kullanmak daha iyi olurdu (https://github.com/angular-ui/ui-router/wiki/Quick-Reference# durum-1) – Daniele

3

Öyle @NicolasMoise gelen cevaba ayrıntı eklemek için, bu çalışma almak için gerekli Bunun çerez kısımlarını test etmedi, fakat şartlı ve durum değişikliği çalıştı.