यह सवाल पुराना है, लेकिन मैं लंबे समय से इस समस्या का जवाब पाने के लिए संघर्ष कर रहा था जो मेरी जरूरतों के लिए काम करेगा और इसे आसानी से पूरा नहीं करेगा। मेरा मानना है कि मेरा निम्नलिखित समाधान वर्तमान में स्वीकृत एक की तुलना में बहुत बेहतर है, शायद क्योंकि कोणीय ने कार्यक्षमता को जोड़ा है क्योंकि यह प्रश्न मूल रूप से सामने आया था।
लघु उत्तर, Module.value विधि का उपयोग करने से आप एक नियंत्रक कंस्ट्रक्टर में डेटा पास कर सकते हैं।
मेरे प्लंकर को यहाँ देखें
मैं एक मॉडल ऑब्जेक्ट बनाता हूं, फिर इसे मॉड्यूल के नियंत्रक के साथ संबद्ध करता हूं, इसे 'मॉडल' नाम से संदर्भित करता हूं
HTML / JS
<html>
<head>
<script>
var model = {"id": 1, "name":"foo"};
$(document).ready(function(){
var module = angular.module('myApp', []);
module.value('model', model);
module.controller('MyController', ['model', MyController]);
angular.bootstrap(document, ['myApp']);
});
function confirmModelEdited() {
alert("model name: " + model.name + "\nmodel id: " + model.id);
}
</script>
</head>
<body >
<div ng-controller="MyController as controller">
id: {{controller.model.id}} <br>
name: <input ng-model="controller.model.name"/>{{controller.model.name}}
<br><button ng-click="controller.incrementId()">increment ID</button>
<br><button onclick="confirmModelEdited()">confirm model was edited</button>
</div>
</body>
</html>
मेरे नियंत्रक में कंस्ट्रक्टर तब उसी पहचानकर्ता 'मॉडल' के साथ एक पैरामीटर को स्वीकार करता है जिसे वह तब एक्सेस कर सकता है।
नियंत्रक
function MyController (model) {
this.model = model;
}
MyController.prototype.incrementId = function() {
this.model.id = this.model.id + 1;
}
टिप्पणियाँ:
मैं बूटस्ट्रैपिंग के मैनुअल इनिशियलाइज़ेशन का उपयोग कर रहा हूं , जो मुझे कोणीय पर भेजने से पहले अपने मॉडल को इनिशियलाइज़ करने की अनुमति देता है। यह मौजूदा कोड के साथ बहुत अधिक अच्छी तरह से खेलता है, जैसा कि आप अपने प्रासंगिक डेटा को सेट करने के लिए इंतजार कर सकते हैं और जब चाहें तब केवल अपने ऐप के कोणीय सबसेट को संकलित कर सकते हैं।
प्लंकर में मैंने उस मॉडल ऑब्जेक्ट के मूल्यों को सचेत करने के लिए एक बटन जोड़ा है जिसे शुरू में जावास्क्रिप्ट में परिभाषित किया गया था और कोणीय में पारित किया गया था, बस यह पुष्टि करने के लिए कि कोणीय वास्तव में मॉडल ऑब्जेक्ट का संदर्भ दे रहा है, बजाय इसे कॉपी करने और कॉपी के साथ काम करने के।
इस लाइन पर:
module.controller('MyController', ['model', MyController]);
मैं एक समारोह इनलाइन के रूप में घोषित करने के बजाय मॉड्यूल.कंट्रोलर फ़ंक्शन में MyController ऑब्जेक्ट पास कर रहा हूं। मुझे लगता है कि यह हमें हमारे नियंत्रक ऑब्जेक्ट को और अधिक स्पष्ट रूप से परिभाषित करने की अनुमति देता है, लेकिन कोणीय प्रलेखन इसे इनलाइन करने की कोशिश करता है इसलिए मुझे लगा कि यह स्पष्टीकरण को सहन करेगा।
मैं "$ गुंजाइश" चर का उपयोग करने के बजाय MyController की "यह" संपत्ति के लिए "सिंटैक्स" के रूप में "नियंत्रक" और मानों को असाइन कर रहा हूं। मेरा मानना है कि यह $ गुंजाइश का उपयोग करके ठीक काम करेगा, नियंत्रक असाइनमेंट फिर कुछ इस तरह दिखेगा:
module.controller('MyController', ['$scope', 'model', MyController]);
और नियंत्रक निर्माता के पास इस तरह एक हस्ताक्षर होगा:
function MyController ($scope, model) {
यदि आप जो भी कारण चाहते हैं, तो आप इस मॉडल को दूसरे मॉड्यूल के मूल्य के रूप में भी संलग्न कर सकते हैं, जिसे आप तब अपने प्राथमिक मॉड्यूल पर निर्भरता के रूप में संलग्न करते हैं।
मेरा मानना है कि उसका समाधान वर्तमान में स्वीकृत एक से बेहतर है क्योंकि
- नियंत्रक को दिया गया मॉडल वास्तव में एक जावास्क्रिप्ट ऑब्जेक्ट है, न कि एक स्ट्रिंग जिसका मूल्यांकन किया जाता है। यह ऑब्जेक्ट का एक सही संदर्भ है और इसमें परिवर्तन इस मॉडल ऑब्जेक्ट के अन्य संदर्भों को प्रभावित करता है।
- कोणीय का कहना है कि एनजी-इनिट के स्वीकृत उत्तर का दुरुपयोग एक दुरुपयोग है, जो यह समाधान नहीं करता है।
जिस तरह से कोणीय ने अन्य सभी उदाहरणों में काम किया है, मैंने देखा है कि नियंत्रक ने मॉडल के डेटा को परिभाषित किया है, जिसने मुझे कभी भी समझ में नहीं आया है, मॉडल और नियंत्रक के बीच कोई अलगाव नहीं है, जो वास्तव में ऐसा नहीं लगता है मेरे लिए एम.वी.सी. यह समाधान आपको वास्तव में एक पूरी तरह से अलग मॉडल ऑब्जेक्ट की अनुमति देता है जिसे आप नियंत्रक में पास करते हैं। ध्यान दें, यदि आप एनजी-इन-डायरेक्टिव का उपयोग करते हैं, तो आप अपने सभी कोणीय HTML को एक अलग फ़ाइल में रख सकते हैं, अपने मॉडल दृश्य और नियंत्रक को पूरी तरह से अलग मॉड्यूलर टुकड़ों में अलग कर सकते हैं।