Подтвердить что ты не робот

Передача аргументов для вызова события 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/

Что я делаю неправильно?

4b9b3361

Ответ 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 из внутренней директивы