У меня есть пример angularJS
<div ng-controller="testCtrl">
<test color1="color1" updateFn="updateFn()"></test>
</div>
<script>
angular.module('dr', [])
.controller("testCtrl", function($scope) {
$scope.color1 = "color";
$scope.updateFn = function() {
alert('123');
}
})
.directive('test', function() {
return {
restrict: 'E',
scope: {color1: '=',
updateFn: '&'},
template: "<button ng-click='updateFn()'>Click</button>",
replace: true,
link: function(scope, elm, attrs) {
}
}
});
</script>
</body>
</html>
Я хочу, чтобы при нажатии кнопки появлялось окно с предупреждением, но ничего не показывалось.
Может кто-нибудь помочь мне?
replace
Атрибут устарел в AngularJS: stackoverflow.com/questions/24194972/...updateFn({msg: 'my message'});
должно использоваться в этом формате при вызове функции внутри функции директивыlink
.Возможно, я чего-то упускаю, но хотя другие решения действительно вызывают функцию родительского контекста, нет возможности передавать аргументы из кода директивы, это потому, что
update-fn
, например, вызываетсяupdateFn()
с фиксированными параметрами{msg: "Hello World"}
. Небольшое изменение позволяет директиве передавать аргументы, что я считаю гораздо более полезным.Обратите внимание, что HTML передает ссылку на функцию, т.е. без
()
скобок.JS
Таким образом, в приведенном выше
callUpdate
примере HTML вызывает локальную функцию области, которая затем «выбирает» updateFn из родительской области и вызывает возвращенную функцию с параметрами, которые может сгенерировать директива.http://jsfiddle.net/mygknek2/
источник
ng-click="updateFn()('Directive Args')"
В вашем HTML-теге директивы test имя атрибута функции не должно быть camelCased, а основано на дефисе.
так что вместо:
записывать:
Это угловой способ определить разницу между атрибутами директивы (такими как функция update-fn) и функциями.
источник
Как насчет передачи функции контроллера с двунаправленной привязкой ? Затем вы можете использовать его в директиве точно так же, как и в обычном шаблоне (для простоты я удалил ненужные части):
Я приземлился на этот вопрос, потому что я попробовал описанный выше метод, но как-то это не сработало. Теперь это работает отлично.
источник
используйте тире и нижний регистр для имени атрибута (как сказали другие ответы):
И используйте «=» вместо «&» в директиве:
Тогда вы можете использовать updateFn как любую другую функцию:
Вот и вы!
источник
update-fn="updateFn"
Мне пришлось использовать привязку "=" вместо "&", потому что это не сработало. Странное поведение.
источник
update-fn="updateFn()"
вы должны включить круглые скобки (и, возможно, params). Передача его в качестве ссылки на функциюupdate-fn="updateFn"
не будет работать с&
привязкой@JorgeGRC Спасибо за ваш ответ. Одна вещь, хотя, «возможно», часть очень важна. Если у вас есть параметр (ы), вы должны также включить его / их в свой шаблон и обязательно указать свои местные жители, например
updateFn({msg: "Directive Args"}
.источник