Я создаю многоразовые компоненты пользовательского интерфейса с директивами AngularJS. Я хотел бы иметь контроллер, который содержит мою бизнес-логику с вложенными компонентами (директивами). Я хочу, чтобы директивы могли управлять одним свойством в области контроллера. Директивам необходимо обладать изоляцией, потому что я могу использовать одну и ту же директиву более одного раза, и каждый экземпляр должен быть привязан к определенному свойству области контроля.Обновление области контроллера по директиве
До сих пор единственным способом, с помощью которого я могу применить изменения к области управления, является вызов scope.$apply()
из директивы. Но это прерывается, когда я нахожусь внутри обратного вызова ng-click из-за ошибок rootScope: inprog (незавершенная операция).
Я подумал о функции на контроллере, которую директива могла бы позвонить, чтобы сделать обновление, но это кажется тяжелым для меня.
Это мой код, который разбивается на обратный вызов ng-click. Имейте в виду, что я не просто хочу решить проблему с ng-click. Я хочу лучшее общее решение для применения директив многократного использования для изменения родительской области/модели.
HTML
<div ng-controller="myCtrl">
<my-directive value="val1"></my-directive>
</div>
Контроллер
...
.controller('myCtrl', ['$scope', function ($scope) {
$scope.val1 = 'something';
}});
директива
...
.directive('myDirective', [function() {
return {
link: function(scope) {
scope.buttonClick = function() {
var val = 'new value';
scope.value = val;
scope.$apply();
};
},
scope: {
value: '='
},
template: '<button ng-click="buttonClick()"></button>'
};
}]);
Вы могли испускать события на $ rootScope. –
@camden_kid Я надеялся на лучшее инкапсулирование. По крайней мере, я буду использовать метод контроллера, который я рассмотрел. Я не думаю, что хочу добавить больше болтовни на область корня, хотя. – Brett
Вам не нужно вызывать $ apply(), так как функция buttonClick вызывается директивой ng-click и, таким образом, не выполняется вне обработки событий углов. Если вы хотите изменить атрибут, то у вас есть штраф (за исключением того, что вы не должны использовать $ apply()). Если вы хотите вызвать функцию обратного вызова, затем передайте вызываемую функцию с помощью '' & ''вместо'' = ''. –