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.preventExecution
true/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.
Bunun cevabı silindi, çünkü bu daha ayrıntılı. – user3632710
Ç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
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