Можно ли передать параметр в директиву и установить это значение в качестве области действия?
Пример:
angular
.module('app', [])
.controller('CTRL', function($scope) {
$scope.some_value = {
instance1: {
key1: 'value11',
key2: 'value12'
},
instance2: {
key1: 'value21',
key2: 'value22'
},
};
})
.directive('uiClock', function() {
return {
restrict: 'E',
scope: {},
template: template,
link: function(scope, element, attr) {
// scope should now contain either (first directive)
// {
// key1: 'value11',
// key2: 'value12'
// }
// or (second directive)
// {
// key1: 'value21',
// key2: 'value22'
// }
console.log(scope);
}
};
});
<div ng-controller="Ctrl">
<ui-clock ng-bind="some_value.instance1"></ui-clock>
<ui-clock ng-bind="some_value.instance2"></ui-clock>
</div>
Причина, по которой я хочу сделать это, - это несколько экземпляров одной и той же директивы, и каждый должен изменить значение, переданное как параметр из родительской области.
Есть предположения?
Вы должны использовать двустороннюю привязку данных.
В вашей директиве вы можете указать область выделения и использовать синтаксис =
, который очень полезен.
контроллер
(function(){
function Controller($scope) {
$scope.some_value = {
instance1: {
key1: 'value11',
key2: 'value12'
},
instance2: {
key1: 'value21',
key2: 'value22'
},
};
}
angular
.module('app', [])
.controller('ctrl', Controller);
})();
директива
(function(){
function directive($compile) {
return {
restrict: 'E',
scope: {
data: '='
},
templateUrl: 'template.html',
link: function(scope, element, attr) {
var elm = angular.element(element);
//For all key in scope.data
Object.keys(scope.data).forEach(function(key){
//Create a new property for our isolate scope
scope[key] = scope.data[key];
//Add attr to our element
elm.attr(key, scope[key]);
});
//Remove our data attribute
elm.removeAttr('data');
//Then we can access to scope.key1 & scope.key2
console.log(scope.key1);
console.log(scope.key2);
}
};
}
angular
.module('app')
.directive('directive', directive);
})();
шаблон
<div>Key 1 : {{key1}}</div>
<div>Key 2 : {{key2}}</div>
Затем вы можете вызвать свою директиву, передав определенные данные в область выделения. Если вы хотите, вы можете удалить атрибут data
для родительского элемента и заменить его на значение вашего объекта.
HTML
<body ng-app='app' ng-controller="ctrl">
<directive data='some_value.instance1'></directive>
<directive data='some_value.instance2'></directive>
</body>
Если вы проверите свой элемент directive
, атрибут data
будет удален и заменит key1 = value...
т.д....
Вы можете увидеть Рабочий Плункер
scope.data
в директиве не поможет. Мне нужно иметь scope.key1
.