当您在指令中处理JS事件时,缺少一个 scope.$apply
。
事件处理发生在纯JS中,在angular上下文之外,当您在父级作用域上调用函数时,您正在调用任何其他普通JS对象上的函数。保留普通JS对象而不是创建它们自己的对象层次结构以拦截函数调用是Angular所做的与其他框架(如ember
)不同的设计选择。
该值确实在作用域上更改,只是Angular不知道它。下一次由任何事情(例如使用ng-click
的不同按钮单击)触发$digest
循环时,更改将显示出来。但是,我们可以通过显式调用scope.$apply()
来确保触发$digest
循环。
解决方法如下:
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);
});
});
"="
将其绑定到指令作用域? - haki$watch
从父作用域继承的值。 - musically_ut