2015-12-18 16 views
8

Varsayılan olarak, önceki duruma geçmek için tarayıcıdaki geri düğmesine bastığınızda önceki durumun denetleyicisi yeniden yüklenir. (bu, ebeveyn-çocuk durumları için geçerli değildir)Köşeli yönlendirici: yeniden denetleyicinin yeniden yüklenmesini durdurma Tarayıcıdaki geri düğmesine basma

Bunun olmasını nasıl engelleyebilirim?

Geçerli durumdaki önceki durumu etkileyen herhangi bir veriyi değiştirmeyeceğim için, önceki durumun yeniden yüklenmesini istemiyorum. home ve about: http://plnkr.co/edit/xkQcEywRZVFmavW6eRGq?p=preview

2 durum vardır:

Burada küçük bir plunker olduğunu. about durumuna gidip geri düğmesine basarsanız, home durum denetleyicisinin yeniden çağrıldığını göreceksiniz.

.state('home', { 
    url: '/home', 
    templateUrl: 'partial-home.html', 
    controller: function($scope) { 
     console.log('i was called'); 
    } 
}) 

Bu beklenen davranıştır inanıyoruz, ama benim önceki durum (bu durumda home) tekrar oluşturulacak için biraz zaman alabilir bazı görselleştirme yapıyor çünkü bunu önlemek istiyoruz.

cevap

6

GlobalCtrl gibi bir global denetleyiciyle başlayalım,veya <html> etiketine ng-controller="GlobalCtrl eklenir.

Bunu yapmak, bu GlobalCtrl'un kapsamını tek sayfanızın Açısal uygulamasında (ui yönlendiriciyi kullanırken) korumamıza olanak sağlayacaktır. senin GlobalCtrl böyle bir şey tanımlamak içeride

Şimdi:

$rootScope.globalData = {preventExecution: false}; 

// This callback will be called everytime you change a page using ui-router state 
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) { 
    $scope.globalData.preventExecution = false; 

    // Just check for your states here 
    if (toState.name == "home" && fromState.name == "about") { 
     $scope.globalData.preventExecution = true; 
    } 
}); 

Şimdi, devlet yapılandırmasında, söz bu $scope.globalData.preventExecution;

.state('home', { 
    url: '/home', 
    templateUrl: 'partial-home.html', 
    controller: function($scope) { 
     if ($scope.globalData.preventExecution) { 
      return; 
     } 
     console.log('i was called'); 
    } 
}); 

Cevap kullanabilirsiniz: kapsam GlobalCtrl'de ve devlet denetçisinde kullandığımız kapsamda bahsettiğimiz, nasıl ilişkilidir?

Bu çok güzel bir soru ama basit. Açısal olarak her yeni kapsam oluşturulduğunda, her zaman üst kapsamını (yalıtılmış olmadıkça) devralır. Bu nedenle, home durum denetleyiciniz başlatıldığında, kapsamı bu durumda burada ana durum kullanılarak oluşturulmuştur ve bu durumda $rootScope örneğidir, bu da bir Nesne'dir (Javascript'te Object, yuvalanmış herhangi bir nesneye kullanılabilir. Read this). Yani şimdi globalData.preventExecutiontrue/false ayarlandığında, aynı veriler home durum denetleyicinizin $scope'unda kullanılabilir. Her iki kapsam da aynı verilerle ilgilidir.sorusuna için

Cevap: o zaman yazabilirsiniz birden devletler için yukarıdaki davranış kodunu elde etmek istiyorsanız genel

bu başarabilirsiniz ui-yönlendirici bazı bayrak veya ayarı vardır böyle bir şey:

Şimdi
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState) { 
    $scope.globalData.preventExecution = false; 

    if (toState.name == "home" && fromState && fromState.preventHomeReExecution) { 
     $scope.globalData.preventExecution = true; 
    } 
}); 

, senin devletler böyle yazılabilir:

.state('about', { 
    url: '/about', 
    templateUrl: 'partial-about.html', 
    preventHomeReExecution: true 
}) 
.state('foo', { 
    url: '/foo', 
    templateUrl: 'partial-foo.html', 
}) 
.state('bar', { 
    url: '/bar', 
    templateUrl: 'partial-bar.html' 
    preventHomeReExecution: true 
}) 

Temel olarak, istediğiniz bayrak olarak preventHomeReExecution: true kullanıyoruz.

+2

Bunun cevabı silindi, çünkü bu daha ayrıntılı. – user3632710

+1

Çalışıyor. Yine de bir şeyi anlayamıyorum, GlobalCtrl'de bahsettiğimiz kapsam ve Devlet denetçisinde kullandığımız kapsam, nasıl ilişkilidir? Aynı kapsamı devlet denetleyicisine de enjekte edilmiş gibi mi görünüyor, yoksa rootScope'un miras alması nedeniyle mi? – gaurav5430

+0

Ayrıca, bu kod çok özeldir ve birçok durum etkileşimi için böyle bir şey yazmak zorunda kalacağım, ui yönlendiricisinde bunu gerçekleştirebilen bir bayrak veya ayar var. Örneğin, durum ne olursa olsun, denetleyiciyi geri tepme üzerine yeniden yüklemeyin. – gaurav5430