2015-07-07 6 views
5

Używając dyrektywy niestandardowej, chcę uruchomić funkcję, gdy wartość zostanie zmieniona.Wybierz dyrektywę niestandardową i ng-zmień

html

<select name="user_type" ng-model="user_type" user-type ng-change="check_type()"> 

dyrektywa

gb_dash.directive('userType', function(){ 
    return{ 
     restrict: 'A', 
     require: '^ngModel', 
     scope:{ 
      check_type: '&' 
     }, 
     link: function(scope, elem, attrs){ 
      scope.check_type = function(){ 
       console.log('changed'); 
      } 
     } 
    } 
}); 

Odpowiedz

3

Skoro masz zakres izolować, Twój check_type nie jest w takim samym zakresie jak wyrażenia ng-change. I nie chciałbyś, żeby tak było.

Zamiast tego, ng-model umożliwia zarejestrowanie słuchacza za pomocą ngModel.$viewChangeListeners - która jest dokładnie używana w danej dyrektywie ngChange - do przechwytywania zdarzeń widoku zmiany modelu.

require: "ngModel", 
scope: { }, // to mimic your directive - doesn't have to be isolate scope 
link: function(scope, element, attrs, ngModel){ 
    ngModel.$viewChangeListeners.push(function(){ 
    console.log('changed'); 
    } 
} 
2

powodu swojego zakresu izolowania można zawierać wezwanie do $parent aby osiągnąć swój wynik. Spróbuj tej zmiany ...

link: function(scope, elem, attrs) { 
    scope.$parent.check_type = function() { 
     console.log('changed'); 
    } 
} 

Jednak wywołanie $parent nie mogą być idealne do sytuacji.

Możesz również porzucić ng-change i zamiast tego $watch swój ngModel. Cel ten można osiągnąć takie jak ...

link: function(scope, elem, attrs, ngModel) { 
    scope.$watch(function() { 
     return ngModel.$modelValue; 
    }, function(newValue, oldValue) { 
     console.log('model value changed...', newValue, oldValue); 
    }, true); 
} 

JSFiddle Link - $parent demo

JSFiddle Link - $watch demo

+0

ostrożność, aby wyjaśnić, dlaczego downvote? – scniro

+0

+1 Twój zakres. $ Parent sprawia, że ​​jestem ciekawa, jak wypróbować tę dyrektywę. Dostosowuję i wywołuję funkcję ngChange. Teraz muszę się dowiedzieć, co to jest zakres izolatu i dlaczego zasięg prosty. $ Eval nie działa w zakresie izolatu. Działa to teraz: 'linku: function (zakres, element, attrs, ngModel) { \t scope.doChange = function() { \t \t ngModel $ setDirty();. \t \t zakres. $ Parent. $ Eval (attrs.ngChange); \t}; '' –

Powiązane problemy