2013-04-18 25 views
188

Birisi AngularJS kontrol cihazının kullanım ömrünün ne olduğunu açıklayabilir mi?AngularJS Denetleyicinin yaşam döngüsü nedir?

  • Bir denetleyici bir tekil mi, yoksa istek üzerine oluşturulmuş/yok edilmiş mi?
  • İkincisi, denetleyicinin yaratılmasını/yok edilmesini ne tetikler?

    var demoApp = angular.module('demo') 
        .config(function($routeProvider, $locationProvider) { 
        $routeProvider 
         .when('/home', {templateUrl: '/home.html', controller: 'HomeCtrl'}) 
         .when('/users',{templateUrl: '/users.html', controller: 'UsersCtrl'}) 
         .when('/users/:userId', {templateUrl: '/userEditor.html', controller: 'UserEditorCtrl'}); 
        }); 
    
    demoApp.controller('UserEditorCtrl', function($scope, $routeParams, UserResource) { 
        $scope.user = UserResource.get({id: $routeParams.userId}); 
    }); 
    

    örneğin:

aşağıdaki örneği göz önüne alalım /users/1 gidin zaman, yukarıdaki örnekte,

kullanım 1 yüklenir ve $scope ayarlanır.

Daha sonra, /users/2 adresine gittiğimde, kullanıcı 2 yüklenir. Aynı örnek UserEditorCtrl yeniden mı kullanılıyor, yoksa yeni bir örnek oluşturuldu mu?

  • Yeni bir örnekse, ilk örnekte ne yıkıma neden olur?
  • Yeniden kullanılıyorsa, bu nasıl çalışır? (yani, veriyi yükleme yöntemi, denetleyicinin yaratılmasında çalışmaktadır)

cevap

212

Aslında asıl soru, bir ngView denetleyicinin yaşam döngüsüdür.

Denetleyiciler singleton değildir. Herkes yeni bir kontrol cihazı oluşturabilir ve asla otomatik olarak yok olmaz. Gerçek şu ki, genellikle temel kapsamının yaşam döngüsüne bağlı. Denetleyici, kapsamı yok olduğunda otomatik olarak yok olmaz. Ancak, temel bir kapsamı yok ettikten sonra, denetleyicisi işe yaramaz (en azından, tasarım gereği, olması gerekir).

hep create a new controller and a new scope navigasyon durumda her zaman özel soru, (aynı zamanda ngController yönergesi için) ngView direktifini olacak cevaplama. Ve last scope is going to be destroyed da.

Yaşam döngüsü "olaylar" oldukça basit. "oluşturma etkinliğiniz", denetleyicinizin kendisidir. Sadece kodunu çalıştır. faydasız ("imha olayı") aldığında bilmek için, kapsama $destroy olayı dinlemek: içerik kapsamı olay $viewContentLoaded üzerinden yüklenen aldığında özellikle ngView için

$scope.$on('$destroy', function iVeBeenDismissed() { 
    // say goodbye to your controller here 
    // release resources, cancel request... 
}) 

, bilirsin edebiliyoruz:

Bir konsept ispatıyla (konsol pencerenizi açın)

Here is a Plunker.

+10

Günümüzde $ kapsamını yok eden kod https://github.com/angular/angular.js/blob/65f5e856a161e7c91b9ebde1360242dc704d0510/src/ngRoute/directive/ngView.js#L179 adresinde yaşıyor. Çok yardımcı, teşekkürler! – w00t

+2

viewContentYükleme yalnızca şablon yüklenmeden hemen önce gönderildiği için bir zaman aşımı kullanırsanız çalışır ... Dokümanlar tam tersini söyler ancak ham şablona başvurur: "HTML STRING" 'bir şablon dosyası yüklendiğinde async gibi. – user3338098

İlgili konular