Обмен данными между директивами
У меня есть некоторые данные под названием 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
три раза, тем самым дублируя его на четыре области - Пусть дочерние директивы наследуют родительскую область видимости и находят
baz
,bats
, или жеotr
наattrs
- Положил
foo
на$rootScope
и ввести это в директивах ребенка
Или есть другой подход, который лучше?
1 ответ
Решение
Вы можете создать фабрику, которую вы можете передать каждой директиве или контроллеру. Это позволит вам иметь только один экземпляр массива в любой момент времени. РЕДАКТИРОВАТЬ: Единственное, что нужно здесь, это убедиться, что вы устанавливаете ссылочные типы, а не примитивные типы в своих областях директив, иначе вы в конечном итоге продублируете значения в каждой области.
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: [] };
}]);
HTML
<dir1></dir1>
<dir2></dir2>
<dir3></dir3>