Pesquisa de site

javascript - Como implementar ng-change para diretiva personalizada em lista de seleção?


Meu código de uso de diretiva

       <input-select ng-model="someModel" ng-change="someFunction()"
   options="countries"></input-select>

Meu código diretivo

 .directive('inputSelect', function () {
    return {
        templateUrl: 'someTemplate.html',
        restrict: 'E',
        scope: {
            ngModel: '=',
            ngChange: '='
        }
    };
});

Meu modelo de diretiva

    <select 
            ng-model="ngModel" ng-init="ngModel "
            ng-options="option[optionId] as option[optionName] for option in options"
            ng-change="ngChange">
    </select>

Então, quando o item selecionado é alterado, a função someFunction() está sendo chamada infinitas vezes (embora a mudança ocorra apenas uma vez). O que deve ser alterado para garantir que someFunction() seja chamada apenas uma vez ( someFunction() é uma função no escopo do controlador no qual a diretiva está sendo usada )

[ Eu realmente tentei usar & e @ para o tipo de escopo do ngChange, somefunction() não é executado se usar esses. ]

Resposta #1

Você deve usar & que é usado para expressão e a partir da marcação você poderia chamar esse método como ngChange() ao invés de apenas ngChange

Marcações

  <select 
        ng-model="ngModel" ng-change="ngChange()"
        ng-options="option[optionId] as option[optionName] for option in options">
  </select>

Código

scope: {
   ngModel: '=',
   ngChange: '&'
}

Exemplo Plunkr