【问题标题】:Bind to attributes in prototypically inherited scope绑定到原型继承范围内的属性
【发布时间】:2014-06-19 09:37:14
【问题描述】:

我想创建一个指令,具有原型继承范围(即 scope=true),但还设置范围绑定到属性,类似于设置隔离范围时的以下内容:

scope = {
'varname':'=attrname'
}

我当前的解决方案是设置 scope=true 并在 link 函数中按照以下行设置与属性的绑定:

scope.$watch(element.attr('attrname'), function(val) { scope.varname = 值; }); // 观察变化 scope.varname = scope.$eval(element.attr('attrname')); // 初始化

虽然它可以解决问题,但它似乎不是很优雅。你建议什么方法?

令我惊讶的是,angularjs 似乎期望在指令中设置新的继承范围时不需要属性绑定。

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    我知道你的意思,我同意你的看法。如果 Angular 为指令提供了一个方便的框架来在父作用域变量和子作用域变量之间建立双向模型绑定,并且仍然支持原型作用域继承,那就太好了。

    在隔离范围内达到与以下相同的效果:

     scope = {'varname':'=attrname'} 
    

    您可以在指令的链接函数中设置双向模型绑定:

    scope: true,
    link:  function(scope, element, attr) {
         // when attrname changes in parent scope, update varname in current scope
         scope.$parent.$watch(attr.attrname, function(newVal) {
              scope.varname = newVal;
         });
    
         // when varname changes in current scope, update attrname in parent scope
         scope.$watch('varname', function(newVal) { 
              scope.$parent[attr.attrname] = newVal;
         });
    }
    

    【讨论】:

      【解决方案2】:

      鉴于您想要实现的目标,我认为您的解决方案完全有效。如果您使用$scope.$observe() 而不是$scope.$watch(),您仍然可以改进您的代码:

      scope.$observe('attrname', function(val) {
          scope.varname = $parse(val)(scope);
      });
      

      【讨论】:

      • 谢谢。我将深入研究您和我的解决方案之间的差异。您认为以这种方式解决问题与 Angular 在正常(隔离范围)场景中内部处理属性绑定的方式相比是否具有性能影响?
      • 我没有看到该解决方案有任何明显的性能问题。但是,我不能保证,角度处理绑定本身的方式可能没有区别。
      • 这是一个有趣的解决方案。我想知道它是如何工作的,不确定我是否理解
      • 其实用observe是不行的(也许只有在属性本身发生变化的时候,但在属性引用变化的变量时不会触发变化)。想了想才明白。
      • 你说得对。 $observe 仅在属性更改时触发。所以你必须$watch属性中的表达式,我建议的解决方案不起作用。
      【解决方案3】:

      我认为您正在寻找的是指令链接函数中的这段代码:

       var yourVar = $parse(attrs.attrName)(scope);  // Parse the attribute with a specific scope context
      

      然后,您将像使用隔离范围指令一样传递属性,同时仍然能够使用原型继承的范围。

      如果你发现自己想观察变量的变化,那么我相信你应该使用隔离作用域而不是继承。通过观察下面建议的属性变化仍然可行,但我认为这不是最佳实践。 (我没有太多支持这个说法,只有直觉,所以选择你认为最好的)

      如果您想了解 $parse 的工作原理,可以在此处找到更多信息: https://docs.angularjs.org/api/ng/service/$parse

      如果您也需要一个 plunker,或者如果您掌握了窍门,请在 cmets 中告诉我。

      【讨论】:

      • 感谢您的回复。我不完全清楚这是如何做到的: - 在继承范围内设置评估表达式 - 持续观察属性值并更新继承范围内的值
      猜你喜欢
      • 2016-02-15
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2015-01-17
      相关资源
      最近更新 更多