Вы используете missing a scope.$apply
, когда вы обрабатываете события JS в своей директиве.
Обработка событий происходит в чистом JS, вне угловой контекст, и когда вы вызываете функцию в родительской области, вы вызываете ее так же, как вы вызываете функцию на любом другом простом объекте JS. Сохранение простых объектов JS вместо создания их собственных иерархий объектов, где они могли перехватывать вызовы функций, является выбором дизайна, который Угловой отличается от, скажем, ember
.
Значение делает изменение на сфере действия, это просто, что Angular не знает об этом. В следующий раз цикл $digest
запускается что-нибудь (скажем, на другой кнопке нажмите ng-click
), появится изменение. Однако мы можем убедиться, что цикл $digest
запускается путем явного вызова scope.$apply()
.
Исправление заключается в следующем:
element.bind("blur change keyup", function() {
// This will tell Angular to rerun the $digest loop
// as we are changing some variables which Angular
// should be informed about.
scope.$apply(function() {
var val = element.find("input").val();
var oldval = scope.values[scope.field.name];
if (oldval !== val && isValid(val))
scope.set_value(scope.field.name,val);
//else
// scope.set_value(scope.field.name,undefined);
});
});
Работа демо: http://jsbin.com/inoKOVU/1/edit
Почему? Я использую функцию для обновления родительской области, поэтому ... из того, что я краснею, я использую ссылки на родителя, так, где именно этот код «работает» без использования приложения? – haki
@haki Обновлен ответ. –
Спасибо за ответ @musically_ut. Могу ли я настроить двустороннюю привязку с родительским типом, используя этот метод? или я должен определить атрибут и связать его с областью директив с помощью '' = "'? – haki