Hier ist mein Problem. Zum Beispiel haben wir die folgende Anweisung, die einige jQuery Widget hinter den Kulissen verwendet:AngularJS-Direktiven - Best Practices bei Verwendung von ngModel mit jQuery-Widget
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);
});
}
};
}]);
Also, wenn Modell der Wert ändert, dann wird der Handler, der $ Uhr registriert verwendet für Änderungen in Modell zu hören ausgeführt werden und folglich wird die Methode 'set_value' des Widgets ebenfalls ausgeführt. Dies bedeutet, dass das 'value_updated'-Ereignis ausgelöst wird.
Meine Frage ist: Was ist die beste Vorgehensweise, um ein ähnliches Verhalten in Direktiven zu implementieren, um zusätzliche Aufrufe von DOM Event Handlern und Watchers zu vermeiden?
Dank Mark, Ihre Lösung ist perfekt löst mein Problem. Könntest du mir bitte sagen - wann ist es angemessen, Beobachter zu benutzen und wann die Implementierung von $ render? – oaleynik
@oaleynik, $ render() sollte immer dann implementiert werden, wenn Sie etwas tun möchten, weil ein ng-Modellwert innerhalb von Angular geändert wurde. ng-model richtet automatisch die Uhr für uns ein und $ render() wird aufgerufen, wenn es eine Änderung bemerkt. Normalerweise möchten Sie mit ng-model $ render implementieren, anstatt Ihre eigene $ watch zu verwenden. –