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

3
我正在尝试从指令更新父作用域中的值字典。通过函数(在此处解释)更新字典的父级,因此当我打印values时,我看到它们,但是当使用
标记进行绑定时,它没有更改。另外,为什么field.error不显示在指令模板中?我在jsbin中设置了一个简化的问题示例。Angular新手,而且相当沮丧......谢谢。
1个回答

5

当您在指令中处理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);
  });
});

工作演示:http://jsbin.com/inoKOVU/1/edit


为什么呢?我正在使用一个函数来更新父级作用域,所以……根据我的理解,它是使用对父级的引用,那么这段代码在哪里“运行”,而不使用apply呢? - haki
@haki 更新了答案。 - musically_ut
感谢 @musically_ut 的回答。我能否使用这种方法设置与父级 dict 的双向绑定?还是我必须定义一个属性,并使用 "=" 将其绑定到指令作用域? - haki
你可以在指令上使用一个属性,并 $watch 从父作用域继承的值。 - musically_ut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接