Angular.js-从指令更新父作用域

Angular.js - updating parent scope from directive

本文关键字:作用域 更新 指令 js- Angular      更新时间:2023-12-17

我正在尝试从指令更新父作用域中的值的dict。dict父级是通过一个函数更新的(在这里解释),所以我真的不明白为什么当我打印values时我会看到它们,但当与pre标签绑定时,它不会改变。另外,为什么field.error没有显示在指令模板中?

我在这个jsbin 中设置了一个简化的问题解决方案

棱角分明的新手,相当沮丧的一个。。。谢谢

在处理指令中的JS事件时,缺少一个scope.$apply

事件处理发生在纯JS中,在角度上下文之外,当您在父作用域上调用函数时,您正在调用它,就像在任何其他纯JS对象上调用函数一样。保留普通的JS对象,而不是创建自己的对象层次结构来拦截函数调用,这是Angular与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