【发布时间】:2013-11-29 08:54:19
【问题描述】:
我正在尝试从指令更新父范围内的值字典。
dict 父级是通过一个函数更新的(解释为here)所以我真的不明白为什么当我打印values 时我看到它们但是当与pre 标签绑定时它没有改变。
另外,为什么field.error 没有显示在指令模板中?
我在jsbin 中设置了我的问题的简化示例
Angular 新手,非常沮丧...谢谢。
【问题讨论】:
标签: javascript angularjs
我正在尝试从指令更新父范围内的值字典。
dict 父级是通过一个函数更新的(解释为here)所以我真的不明白为什么当我打印values 时我看到它们但是当与pre 标签绑定时它没有改变。
另外,为什么field.error 没有显示在指令模板中?
我在jsbin 中设置了我的问题的简化示例
Angular 新手,非常沮丧...谢谢。
【问题讨论】:
标签: javascript angularjs
当您在指令中处理 JS 事件时,您是 missing a scope.$apply。
事件处理发生在纯 JS 中,在角度上下文之外,当您在父作用域上调用函数时,您调用它就像在任何其他普通 JS 对象上调用函数一样。保留普通的 JS 对象而不是创建它们自己的对象层次结构来拦截函数调用是 Angular 做出的一种设计选择,与 ember 不同。
值 确实 在范围上发生变化,只是 Angular 没有意识到这一点。下一次$digest 循环由anything 触发(例如,使用ng-click 单击不同的按钮),更改就会显示出来。但是,我们可以做的是确保通过显式调用 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);
});
});
【讨论】:
"=" 的指令范围?
$watch从父范围继承的值。