एक AngularJS नियंत्रक का जीवनचक्र क्या है?


199

क्या कोई कृपया स्पष्ट कर सकता है कि AngularJS नियंत्रक का जीवनचक्र क्या है?

  • क्या नियंत्रक एक सिंगलटन है, या मांग पर बनाया / नष्ट किया गया है?
  • यदि उत्तरार्द्ध, क्या नियंत्रक के निर्माण / विनाश को ट्रिगर करता है?

नीचे दिए गए उदाहरण पर विचार करें:

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});
});

उदाहरण के लिए:

उपरोक्त उदाहरण में, जब मैं नेविगेट करता हूं /users/1, तो उपयोगकर्ता 1 लोड हो जाता है, और सेट हो जाता है $scope

फिर, जब मैं नेविगेट करता हूं, तो /users/2उपयोगकर्ता 2 लोड होता है। क्या UserEditorCtrlपुन: उपयोग की गई एक ही आवृत्ति है , या एक नया उदाहरण बनाया गया है?

  • यदि यह एक नया उदाहरण है, तो पहले उदाहरण के विनाश को क्या ट्रिगर करता है?
  • यदि इसका पुन: उपयोग किया जाता है, तो यह कैसे काम करता है? (यानी; डेटा लोड करने की विधि कंट्रोलर के निर्माण पर चलती है)

जवाबों:


227

खैर, वास्तव में सवाल यह है कि एक ngViewनियंत्रक के लिए जीवन चक्र क्या है ।

नियंत्रक एकल नहीं हैं। कोई भी एक नया नियंत्रक बना सकता है और वे कभी भी ऑटो-नष्ट नहीं होते हैं। तथ्य यह है कि यह आम तौर पर अपने अंतर्निहित दायरे के जीवन चक्र के लिए बाध्य है। जब भी इसका दायरा नष्ट हो जाता है, तब नियंत्रक स्वचालित रूप से नष्ट नहीं होता है। हालांकि, एक अंतर्निहित गुंजाइश को नष्ट करने के बाद, इसका नियंत्रक बेकार है (कम से कम, डिजाइन से, यह होना चाहिए)।

आपके विशिष्ट प्रश्न का उत्तर देते हुए, एक ngViewनिर्देश (साथ ही ngControllerनिर्देशन के लिए) हमेशा एक नया नियंत्रक और हर बार एक नेविगेशन होने पर एक नया दायरा बनाएगा । और आखिरी गुंजाइश नष्ट होने वाली है

जीवन चक्र "घटनाएँ" काफी सरल हैं। आपकी "निर्माण घटना" आपके नियंत्रक का निर्माण है। बस अपना कोड चलाएं। यह जानने के लिए कि कब यह बेकार हो जाता है ( "विनाश घटना" ), गुंजाइश $destroyघटना सुनें :

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

के लिए ngViewविशेष रूप से, आप को पता है की सामग्री गुंजाइश घटना के माध्यम से लोड हो जाता है जब में सक्षम हैं $viewContentLoaded:

$scope.$on('$viewContentLoaded', function readyToTrick() {
  // say hello to your new content here
  // BUT NEVER TOUCHES THE DOM FROM A CONTROLLER
});

यहां एक कॉन्सेप्ट प्रूफ वाला प्लंकर है (अपनी कंसोल विंडो खोलें)।


10
आजकल $ स्कोप को नष्ट करने वाला कोड github.com/angular/angular.js/blob/… पर रहता है । बहुत मददगार, धन्यवाद!
w00t

4
viewContentLoaded केवल तभी काम करती है जब आप एक टाइमआउट का उपयोग करते हैं क्योंकि यह टेम्प्लेट लोड होने से ठीक पहले भेजा जाता है ... डॉक्स इसके विपरीत कहते हैं, लेकिन वे कच्चे का उल्लेख कर रहे हैं template: "HTML STRING"जब यह टेम्प्लेट फ़ाइल होती है तो यह लोड हो जाता है जैसे कि यह async लोड हो जाता है।
user3338098
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.