AngularJs "नियंत्रक" वाक्यविन्यास - स्पष्टीकरण के रूप में?


121

मैं के बारे में angularJS से नए वाक्यविन्यास के बारे में पढ़ाcontroller as xxx

वाक्यविन्यास InvoiceController as invoiceकोणीय को नियंत्रक को त्वरित करने और वर्तमान दायरे में चर चालान में सहेजने के लिए कहता है।

विज़ुअलाइज़ेशन:

यहाँ छवि विवरण दर्ज करें

ठीक है, इसलिए मेरे पास $scopeमेरे नियंत्रक में पैरामीटर नहीं है और कोड नियंत्रक में बहुत क्लीनर होगा।

परंतु

मुझे दृश्य में एक और उपनाम निर्दिष्ट करना होगा

इसलिए अब तक मैं कर सकता था:

<input type="number" ng-model="qty"  />

....controller('InvoiceController', function($scope) {
   // do something with $scope.qty <--notice

और अब मैं कर सकता हूँ:

 <input type="number" ng-model="invoic.qty"  /> <-- notice 

  ....controller('InvoiceController', function() {
       // do something with  this.qty  <--notice

सवाल

इसे करने का लक्ष्य क्या है? एक जगह से हटाकर दूसरी जगह जोड़ देंगे?

मुझे यह देखकर खुशी होगी कि मैं क्या याद कर रहा हूं।


8
यह वीडियो इसे बहुत अच्छी तरह से समझाता है। youtube.com/watch?v=tTihyXaz4Bo मुझे लगता है कि इसका उपयोग HTML में क्लीनर कोड के लिए किया जाता है।
फेजर खान

1
स्पष्टता। मैं नियंत्रक में $ गुंजाइश.x Vs this.x का उपयोग करने के बारे में परेशान नहीं हूं, लेकिन मेरे विचार में {{चालान.x}} पर बाध्यकारी मुझे {{x}} (imho) से अधिक बताता है। इसके अलावा, मैं सोच रहा हूं कि क्या यह एक ऐसे मुद्दे को संबोधित करता है जिसे मैंने कोणीय में सुना था, जहां नियंत्रक में गैर-वस्तुएं मुद्दे हैं (इसलिए चीजें। x ठीक होंगी, लेकिन x एक मुद्दा पैदा करेगा)।
मैट रॉबर्ट्स

1
@MattRoberts आपकी अंतिम टिप्पणी को संबोधित करने के लिए - आपके द्वारा संदर्भित गैर-ऑब्जेक्ट समस्या एक कोणीय मुद्दा नहीं है जितना कि जावास्क्रिप्ट प्रोटोटाइपिक विरासत का एक तथ्य है। यहाँ कोणीय में क्यों होता है (क्यों controller asइसे ठीक करता है) के साथ एक अच्छी व्याख्या है ।
रस मटनी

मैं $ स्कोप को कैसे बदलूंगा। $ प्रसारण? इस नए मामले में क्योंकि मेरा यह। $ प्रसारण काम नहीं कर रहा है
गौरव

1
@ गौरव आप अभी भी $ स्कोप सेवा को अपने कंट्रोलर में इंजेक्ट कर सकते हैं, भले ही आप कुछ गुणों, विधियों आदि के लिए सिंटैक्स के रूप में कंट्रोलर का उपयोग करते हों
डेरेक

जवाबों:


163

इसके बारे में कई बातें हैं।

कुछ लोगों को $scopeवाक्य रचना पसंद नहीं है (मुझे क्यों नहीं पूछें)। वे कहते हैं कि वे सिर्फ उपयोग कर सकते हैं this। यही एक लक्ष्य था।

यह स्पष्ट करना कि एक संपत्ति कहाँ से आती है, वास्तव में उपयोगी भी है।

आप नियंत्रकों को घोंसला दे सकते हैं और HTML पढ़ते समय यह बहुत स्पष्ट है कि प्रत्येक संपत्ति कहां आती है।

आप डॉट नियम की कुछ समस्याओं से भी बच सकते हैं ।

उदाहरण के लिए, दो नियंत्रक, दोनों एक ही नाम 'नाम' के साथ, आप यह कर सकते हैं:

<body ng-controller="ParentCtrl">
    <input ng-model="name" /> {{name}}

    <div ng-controller="ChildCtrl">
        <input ng-model="name" /> {{name}} - {{$parent.name}}
    </div>
</body>

आप माता-पिता और बच्चे दोनों को संशोधित कर सकते हैं, इसके बारे में कोई समस्या नहीं है। लेकिन आपको $parentमाता-पिता का नाम देखने के लिए उपयोग करने की आवश्यकता है , क्योंकि आपने इसे अपने बाल नियंत्रक में छाया दिया है। बड़े पैमाने पर HTML कोड में $parentसमस्या हो सकती है, आप नहीं जानते कि यह नाम कहाँ से आता है।

साथ में controller as आप कर सकते हैं:

<body ng-controller="ParentCtrl as parent">
    <input ng-model="parent.name" /> {{parent.name}}

    <div ng-controller="ChildCtrl as child">
      <input ng-model="child.name" /> {{child.name}} - {{parent.name}}
    </div>
</body>

एक ही उदाहरण है, लेकिन यह पढ़ने के लिए बहुत स्पष्ट है।


10
यहाँ भी इस बात का एक बहुत अच्छा उदाहरण है कि यह दृष्टिकोण कुछ के लिए भ्रामक क्यों हो सकता है: stackoverflow.com/questions/25405543/…
जूलियन हॉलमैन

यह बहुत उपयोगी है जब आप नियंत्रकों को घोंसला बनाते हैं!
C_J

1
मुझे आपके उत्तर के समान कार्यान्वयन से परेशानी हो रही है, कृपया stackoverflow.com/questions/38315538
कोडी

यह आपको अपने नियंत्रक के रूप में एक es6 वर्ग का उपयोग करने की अनुमति देता है और HTML में विधियों का संदर्भ देता है। foo() { ... }की तुलना में जिस तरह से क्लीनर है $scope.foo = function() { ... }
बजे ब्रायन मैककचटन

17

controller asसिंटैक्स के साथ मुख्य लाभ मैं देख रहा हूं कि आप नियंत्रकों के साथ कक्षाओं के रूप में काम कर सकते हैं, न कि केवल कुछ स्कोप-डेकोरेटिंग फ़ंक्शंस में, और विरासत का लाभ उठा सकते हैं। मैं अक्सर ऐसी स्थिति में दौड़ता हूं जब एक कार्यक्षमता होती है जो बहुत सारे नियंत्रकों के समान होती है, और सबसे स्पष्ट बात यह है कि एक BaseControllerवर्ग बनाना और उससे विरासत प्राप्त करना है।

भले ही $ गुंजाइश दायरा है, जो आंशिक रूप से इस समस्या को हल करता है, कुछ लोग अधिक ओओपी तरीके से कोड लिखना पसंद करते हैं, जो कि मेरी राय में, कोड को तर्क और परीक्षण के लिए आसान बनाता है।

यहाँ प्रदर्शित करने के लिए एक पहेली है: http://jsfiddle.net/HB7LU/5796/


1
यह अधिक अपवित्र होना चाहिए, क्योंकि फिडल वास्तव में मददगार है
मोग कहते हैं कि मोनिका

13

मेरा मानना ​​है कि जब आप नेस्टेड स्कोप होते हैं तो एक विशेष लाभ स्पष्ट है। अब यह पूरी तरह से स्पष्ट हो जाएगा कि संपत्ति का संदर्भ किस दायरे से आता है।


7

स्रोत

$scope objectऔर का उपयोग कर एक नियंत्रक बनाने के बीच अंतर“controller as”वाक्य रचना और वीएम

$ गुंजाइश ऑब्जेक्ट का उपयोग करके एक नियंत्रक बनाना

आमतौर पर हम $ गुंजाइश ऑब्जेक्ट का उपयोग करके एक नियंत्रक बनाते हैं जैसा कि नीचे दी गई सूची में दिखाया गया है:

myApp.controller("AddController", function ($scope) {



    $scope.number1;

    $scope.number2;

    $scope.result;

    $scope.add = function () {

        $scope.result = $scope.number1 + $scope.number2;

    }

});

ऊपर हम $ गुंजाइश ऑब्जेक्ट नियंत्रक और दृश्य का उपयोग करते हुए, तीन चर और एक व्यवहार के साथ AddController बना रहे हैं, जो एक दूसरे से बात करते हैं। $ गुंजाइश ऑब्जेक्ट का उपयोग डेटा और व्यवहार को दृश्य में पास करने के लिए किया जाता है। यह व्यू और कंट्रोलर को एक साथ जोड़ देता है।

आवश्यक रूप से $ गुंजाइश वस्तु निम्नलिखित कार्य करती है:

  1. कंट्रोलर से दृश्य में डेटा पास करें

  2. नियंत्रक से दृश्य तक व्यवहार पास करें

  3. नियंत्रक को देखता है और एक साथ देखता है

  4. $ गुंजाइश ऑब्जेक्ट संशोधित हो जाता है जब एक दृश्य बदलता है और एक दृश्य संशोधित हो जाता है जब $ गुंजाइश ऑब्जेक्ट के गुण बदल जाते हैं

हम डेटा और व्यवहार को दृश्य में पास करने के लिए $ स्कोप ऑब्जेक्ट के गुणों को संलग्न करते हैं। नियंत्रक में $ गुंजाइश ऑब्जेक्ट का उपयोग करने से पहले, हमें इसे नियंत्रक फ़ंक्शन में निर्भरता के रूप में पारित करने की आवश्यकता है।

वाक्यविन्यास और vm के रूप में "नियंत्रक" का उपयोग करना

हम उपर्युक्त नियंत्रक को सिंटैक्स और vm वेरिएबल के रूप में नीचे लिस्ट में दिखाए अनुसार फिर से लिख सकते हैं:

myApp.controller("AddVMController", function () {

    var vm = this;

    vm.number1 = undefined;

    vm.number2=undefined;

    vm.result =undefined;

    vm.add = function () {

        vm.result = vm.number1 + vm.number2;

    }

});

अनिवार्य रूप से हम इसे एक वैरिएबल vm को असाइन कर रहे हैं और फिर एक प्रॉपर्टी और व्यवहार उस पर अटैच कर रहे हैं। व्यू पर हम कंट्रोलर के रूप में कंट्रोलर का उपयोग करके AddVmController का उपयोग कर सकते हैं। यह नीचे दी गई सूची में दिखाया गया है:

<div ng-controller="AddVMController as vm">

            <input ng-model="vm.number1" type="number" />

            <input ng-model="vm.number2" type="number" />

            <button class="btn btn-default" ng-click="vm.add()">Add</button>

            <h3>{{vm.result}}</h3>

  </div>

हम वाक्यविन्यास के रूप में नियंत्रक में "vm" से दूसरे नाम का उपयोग कर सकते हैं। हुड के तहत, AngularJS $ स्कोप ऑब्जेक्ट बनाता है और गुण और व्यवहार संलग्न करता है। हालाँकि नियंत्रक को सिंटैक्स के रूप में उपयोग करने से, कोड नियंत्रक पर बहुत साफ होता है और दृश्य पर केवल उपनाम नाम दिखाई देता है।

नियंत्रक के रूप में नियंत्रक का उपयोग करने के लिए यहां कुछ चरण दिए गए हैं:

  1. $ गुंजाइश वस्तु के बिना एक नियंत्रक बनाएँ।

  2. इसे स्थानीय चर पर असाइन करें। मैंने vm के रूप में परिवर्तनीय नाम को प्राथमिकता दी है, आप अपनी पसंद का कोई भी नाम चुन सकते हैं।

  3. Vm वैरिएबल में डेटा और व्यवहार संलग्न करें।

  4. दृश्य पर, नियंत्रक को सिंटैक्स के रूप में उपयोग करके नियंत्रक को एक अन्य नाम दें।

  5. आप उपनाम को कोई भी नाम दे सकते हैं। जब तक मैं नेस्टेड नियंत्रकों के साथ काम नहीं कर रहा हूं, मैं वीएम का उपयोग करना पसंद करता हूं।

नियंत्रक बनाने में, $ स्कोप ऑब्जेक्ट दृष्टिकोण या सिंटैक्स के रूप में नियंत्रक का उपयोग करने के कोई प्रत्यक्ष लाभ या नुकसान नहीं हैं। यह विशुद्ध रूप से पसंद की बात है, हालांकि, सिंटैक्स के रूप में नियंत्रक का उपयोग करना नियंत्रक के जावास्क्रिप्ट कोड को अधिक पठनीय बनाता है और इस संदर्भ से संबंधित किसी भी मुद्दे को रोकता है।

$ स्कोप ऑब्जेक्ट दृष्टिकोण में नेस्टेड नियंत्रक

नीचे दी गई सूची में दिखाए गए अनुसार हमारे पास दो नियंत्रक हैं:

myApp.controller("ParentController", function ($scope) {



    $scope.name = "DJ";

    $scope.age = 32;

});

myApp.controller("ChildController", function ($scope) {



    $scope.age = 22;

    $scope.country = "India";



});

संपत्ति "आयु" दोनों नियंत्रकों के अंदर है, और इन दोनों नियंत्रकों को नीचे सूचीबद्ध सूची में दिखाए अनुसार घोंसला बनाया जा सकता है:

<div ng-controller="ParentController">



            <h2>Name :{{name}} </h2>

            <h3>Age:{{age}}</h3>



             <div ng-controller="ChildController">

                    <h2>Parent Name :{{name}} </h2>

                    <h3>Parent Age:{{$parent.age}}</h3>

                    <h3>Child Age:{{age}}</h3>

                    <h3>Country:{{country}}</h3>

             </div>

        </div>

जैसा कि आप देखते हैं, पेरेंट कंट्रोलर की आयु संपत्ति तक पहुंचने के लिए हम $ पेरेंट का उपयोग कर रहे हैं। प्रसंग पृथक्करण यहाँ बहुत स्पष्ट नहीं है। लेकिन नियंत्रक को सिंटैक्स के रूप में उपयोग करते हुए, हम नेस्टेड नियंत्रकों के साथ अधिक सुरुचिपूर्ण तरीके से काम कर सकते हैं। मान लें कि हमारे पास नीचे दी गई सूची में दिखाए अनुसार नियंत्रक हैं:

myApp.controller("ParentVMController", function () {

    var vm = this;

    vm.name = "DJ";

    vm.age = 32;

});

myApp.controller("ChildVMController", function () {

    var vm = this;

    vm.age = 22;

    vm.country = "India";



});

नीचे दिए लिस्टिंग में दिखाए गए अनुसार इन दो नियंत्रकों को नेस्ट किया जा सकता है:

<div ng-controller="ParentVMController as parent">



            <h2>Name :{{parent.name}} </h2>

            <h3>Age:{{parent.age}}</h3>



            <div ng-controller="ChildVMController as child">

                <h2>Parent Name :{{parent.name}} </h2>

                <h3>Parent Age:{{parent.age}}</h3>

                <h3>Child Age:{{child.age}}</h3>

                <h3>Country:{{child.country}}</h3>

            </div>

 </div>

सिंटैक्स के रूप में नियंत्रक में, हमारे पास अधिक पठनीय कोड है और पैतृक संपत्ति को $ पेरेंट सिंटैक्स का उपयोग करने के बजाय मूल नियंत्रक के अन्य नाम का उपयोग करके एक्सेस किया जा सकता है।

मैं इस पोस्ट को यह कहकर समाप्त करूंगा कि यह पूरी तरह से आपकी पसंद है कि क्या आप सिंटैक्स या $ स्कोप ऑब्जेक्ट के रूप में नियंत्रक का उपयोग करना चाहते हैं। इसका कोई बड़ा फायदा या नुकसान नहीं है, बस यह है कि संदर्भ पर आपके पास जो सिंटैक्स है, उस पर नियंत्रण आपके पास काम करने के लिए थोड़ा आसान है, यह देखने पर नेस्टेड नियंत्रकों में स्पष्ट अलगाव है।


4

मुझे लगता है कि मुख्य लाभ अधिक सहज एपि है क्योंकि विधियाँ / गुण नियंत्रक उदाहरण से सीधे जुड़े होते हैं न कि गुंजाइश वस्तु से। मूल रूप से, पुराने दृष्टिकोण के साथ, नियंत्रक गुंजाइश वस्तु के निर्माण के लिए सिर्फ एक सजावट बन जाता है।

यहाँ इस पर कुछ और जानकारी दी गई है: http://www.syntaxsuccess.com/viewarticle/551798f20c5f3f3c3ff0ffcc9ff


3

मैंने जो भी पढ़ा है, उसमें से $ 2 का दायरा एंगुलर 2.0 में निकाला जाएगा, या कम से कम हम $ स्कोप के उपयोग को कैसे देखेंगे। नियंत्रक का उपयोग करना शुरू करना अच्छा हो सकता है क्योंकि 2.0 पास की रिहाई।

इस पर अधिक चर्चा के लिए यहां वीडियो लिंक ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.