2012-11-20 20 views
20

मैं कुछ डेटा जो एक गुंजाइश जो तीन बच्चों को माता-पिता है में रहती है foo कहा जाता है:शेयरिंग डेटा

<div ng-init="foo=[1, 2, 3]"> 
    <bar foo="{{foo}}" baz="{{odp}}" /> 
    <mpq foo="{{foo}}" bats="{{maktz}}" /> 
    <ktr foo="{{foo}}" otr="{{ompg}}" /> 
</div> 

bar.scope = {foo: '=', baz: '@'}; 
mpq.scope = {foo: '=', bats: '@'}; 
ktr.scope = {foo: '=', otr: '@'}; 

उन तीन निर्देशों के बीच foo साझा करने के लिए सबसे अच्छा तरीका क्या है? विकल्प शामिल हैं: एक अलग गुंजाइश

  • उपयोग foo तीन बार में पारित करने के लिए है, जिससे चार स्कोप
  • के पार डुप्लिकेट बच्चे निर्देशों माता पिता गुंजाइश के वारिस, और attrs
  • पर baz, bats, या otr लगता है है
  • रखो $rootScope पर foo और इंजेक्षन कि बच्चे निर्देशों

में या वहां एक और दृष्टिकोण है कि शर्त है Ter?

+3

अन्य विकल्प के लिए एक सेवा का उपयोग हो सकता है और अपने निर्देशों में यह इंजेक्शन लगाने, लेकिन यह वास्तव में आपके डेटा की प्रकृति पर निर्भर करता है। –

उत्तर

27

आप एक कारखाना बना सकते हैं जिसे आप प्रत्येक निर्देश या नियंत्रक को पास कर सकते हैं। यह सुनिश्चित करेगा कि आपके पास किसी भी समय सरणी का केवल एक उदाहरण होगा। संपादित करें: यहां केवल एक ही गचाचा यह सुनिश्चित करना है कि आप संदर्भ प्रकार सेट कर रहे हैं, न कि अपने निर्देशक क्षेत्रों पर आदिम प्रकार, या आप प्रत्येक दायरे में मानों को डुप्लिकेट कर देंगे।

Here is an example on Plnkr.co

app.controller('MainCtrl', function($scope, dataService) { 
    $scope.name = 'World'; 
    //set up the items. 
    angular.copy([ { name: 'test'} , { name: 'foo' } ], dataService.items); 
}); 

app.directive('dir1', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 1</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.directive('dir2', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 2</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.directive('dir3', function(dataService){ 
    return { 
    restrict: 'E', 
    template: '<h3>Directive 3</h3>' + 
    '<div ng-repeat="item in data.items">' + 
     '<input type="text" ng-model="item.name"/>' + 
    '</div>', 
    link: function(scope, elem, attr) { 
     scope.data = dataService; 
    } 
    }; 
}); 

app.factory('dataService', [function(){ 
    return { items: [] }; 
}]); 

एचटीएमएल

<dir1></dir1> 
    <dir2></dir2> 
    <dir3></dir3> 
+2

मैंने इसे माना, लेकिन कोणीय दस्तावेज़ इसे हतोत्साहित करते हैं: http://docs.angularjs.org/misc/faq –

+4

मुझे लगता है कि आप इसके बारे में बात कर रहे हैं: "इसके विपरीत, ऐसी सेवा न बनाएं जिसका जीवन में एकमात्र उद्देश्य है डेटा के बिट्स को स्टोर और लौटने के लिए। " यह वास्तव में इस बात पर निर्भर करता है कि आप डेटा के साथ क्या कर रहे हैं। यदि आप इसे एक समान तरीके से नियंत्रक/निर्देश/आदि (जो कि ज्यादातर लोग होंगे) में एक समान तरीके से जोड़ रहे हैं, तो एक सेवा बनाएं ... अन्यथा, इसे $ रूटस्कोप में चिपकाएं। जब तक आप जो कुछ भी कर रहे हैं वह पालन करना आसान है और, सबसे महत्वपूर्ण बात यह है कि टेस्टेबिलिटी तोड़ती नहीं है, यह कोशेर है। –

+0

... जैसा कि @ pkowslowski.opensource ने ऊपर बताया: यह वास्तव में आपके डेटा की प्रकृति पर निर्भर करता है। –

संबंधित मुद्दे