Ecco il mio problema. Per esempio, abbiamo la seguente direttiva, che utilizza alcuni widget di jQuery dietro le quinte:Direttive AngularJS - best practice quando si utilizza ngModel con widget jQuery
module.directive('myWidget', [function() {
return {
require: "ngModel",
restrict: "A",
replace: true,
templateUrl: "templates/myWidget.html",
link: function(scope, element, attrs, ctrl) {
element.widget_name().on('value_updated', function(event) {
scope.$apply(function() {
var newModelValue = event.some_value;
ctrl.$setViewValue(newModelValue);
});
});
scope.$watch(attrs["ngModel"], function(value){
element.widget_name('set_value', value);
});
}
};
}]);
Quindi, se poi verranno eseguiti il gestore che è registrato utilizzando $ orologio per ascoltare i cambiamenti nel modello cambia il valore del modello, e, di conseguenza, verrà eseguito anche il metodo 'set_value' del widget. Ciò significa che verrà attivato l'evento 'value_updated'.
La mia domanda è: qual è la prassi migliore per implementare comportamenti simili nelle direttive per evitare chiamate extra di gestori di eventi DOM e osservatori?
Grazie Mark, la tua soluzione risolve perfettamente il mio problema. Ma potresti dirlo, quando è appropriato usare osservatori e quando l'implementazione di render $? – oaleynik
@oaleynik, $ render() dovrebbe essere implementato ogni volta che si vuole fare qualcosa perché un valore di modello ng è stato modificato all'interno di Angular. ng-model imposta automaticamente l'orologio per noi, e $ render() viene chiamato se nota una modifica. Quindi normalmente, con ng-model, vuoi implementare $ render invece di usare il tuo $ watch. –