【问题标题】:Angular.js - updating parent scope from directiveAngular.js - 从指令更新父范围
【发布时间】:2013-11-29 08:54:19
【问题描述】:

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

我在jsbin 中设置了我的问题的简化示例

Angular 新手,非常沮丧...谢谢。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

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

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

    【讨论】:

    • 为什么会这样?我正在使用一个函数来更新父范围,所以......从我的红色它使用对父级的引用所以,这段代码到底在哪里“运行”而不使用 apply ?
    • @haki 更新了答案。
    • 感谢@musically_ut 的回答。我可以使用此方法设置与父 dict 的两种方式绑定吗?或者我必须定义一个属性并将其绑定到 "=" 的指令范围?
    • 您可以使用指令上的属性和$watch从父范围继承的值。
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多