Передача аргументов для вызова события ngChange из внутренней директивы
У меня есть директива, которая принимает атрибут ng-change
:
<radio-buttons options="optionsList"
ng-model="myModel"
ng-change="myCallback($event)"></radio-buttons>
Я определил функцию в моем контроллере myCallback
, которая выглядит так:
$scope.myCallback = function(e) {
console.log("Callback from controller");
console.log(e);
}
В моей директиве radioButton
существует следующий выбор функции. Мне нужно определить, когда в моей директиве в функции select выполняется обратный вызов ngChange:
function select(scope, val) {
if (!scope.disabled && scope.selectedValue != val) {
scope.selectedValue = val;
scope.model = val;
scope.callback.call();
}
}
Проблема, с которой я столкнулась, - это аргумент $event
в myCallback
не передается, когда я выполняю myCallback
внутри функции select
моей директивы.
Fiddle: http://jsfiddle.net/dkrotts/BtrZH/7/ Обновлено: http://jsfiddle.net/dkrotts/BtrZH/8/
Что я делаю неправильно?
Ответы
Ответ 1
Если вы хотите контролировать, когда вызывается обработчик для ng-change, я думаю, что самый простой способ - полностью удалить ng-change - вы можете вызвать функцию контроллера непосредственно из обратного вызова ng-click.
Я думаю, что это обеспечивает желаемую функциональность:
http://jsfiddle.net/BtrZH/11/
Вы можете захватить объект события из щелчка, если необходимо:
ng-click="select(scope, option.value, $event)"
Затем вы можете вызвать функцию контроллера по желанию:
function select(scope, val, $event) {
if (!scope.disabled && scope.selectedValue != val) {
scope.selectedValue = val;
scope.model = val;
scope.$parent.myCallback($event);
}
}
Ответ 2
Вы должны передать параметр в обратном вызове так:
callback({parametername: value});
И вы должны сопоставить имя параметра с объявленным в HTML
В вашем случае:
callback({$event: val})
Ответ 3
Следующее выглядит не очень хорошо, но будет работать (оно создало бы другую переменную $event
и передало бы ее через ng-change
):
ng-click="$event = $event" ng-change="myCallback($event)"
Ответ 4
Чтобы передать значения контроллеру, вызовите его с помощью объекта с ключами, соответствующими аргументам приемника, как определено в вашем шаблоне.
например.
Элемент
<my-element change="myFunction(value, id, event)"></my-element>
абонент
{
"restrict" : ...,
"scope" : {
"change" : "&"
},
"controller" : function($scope){
this.someEventHandler = function($event){
// called here
scope.change({
"value" : "somevalue",
"id" : "someid",
"event" : $event
});
}
}
}
приемник родительского контроллера
$scope.myFunction = function(v, i, e){
// do stuff
}
REF: Передача аргументов для вызова вызова ngChange из внутренней директивы