【问题标题】:What is "=*" in AngularJSAngularJS 中的“=*”是什么
【发布时间】:2016-08-11 03:33:43
【问题描述】:

我遇到过这种isolate binding 规范:

scope: {
   property: "=*"
}

这里的星号是什么意思?有人可以举个例子吗?

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    =* 的隔离绑定是为了浅层观察集合的变化。

    让我解释一下:

    通常我们在脚本中使用的 watchCollection 变量如下:

    $scope.arr = ['foo', 'bar', 'lorem', 'ipsum'];
    $scope.arrCount = 4;
    
    $scope.$watchCollection('arr', function(new, old) {
      $scope.arrCount = new.length;
    }); 
    

    但是如果你想在 html 属性本身中做对象绑定呢?

    <my-directive my-attr="arr"><!--$scope.arr-->
    

    如果你这样做:

    scope: {
       myAttr: "=*"
    }
    

    现在,指令属性被分配,因为它应该浅表观察。并且这次使用watchCollection很好用。

    所以,=* 将在我们需要浅层监视更改时使用(即 $watchCollection 而不是 $watch),您可以使用 =* 或 =attr (=? 或 = *?attr 如果该属性是可选的),如docs 中所述。

    虽然,我们可以使用= for watchCollection 来深入观察我们可以使用=* 的对象或数组。但唯一的区别是使用 =* 方法 collection 变为 true 并且当集合变为 true angularjs 使用 $watchCollection 删除观察者并使用 $watch 删除收集为假时的观察者:

    if (definition.collection) { //using `=*`
      removeWatch = scope.$watchCollection(attrs[attrName], parentValueWatch);
    } else { //using `=`
      removeWatch = scope.$watch($parse(attrs[attrName],
         parentValueWatch), null, parentGet.literal);
    }
    

    所以,当你想浅层观察 collection 时,你需要使用=*

    【讨论】:

    • 你能看看这个fiddle吗?它似乎正在收集没有“=*”的集合中的更改
    • 隔离作用域似乎没有$watchCollection 方法,您能否修改我的示例以使其更清楚?
    • 抱歉,试过什么?我不能在隔离范围内调用$watchCollection,所以我不能尝试你的建议......这是令人困惑的部分
    • 刚刚尝试使用 $watch 和第三个参数作为深度手表的真实值,它的工作正常:jsfiddle.net/9F68Y/62 但它也仅适用于=。可能我们只能使用 $watchCollection。将调试并通知您。
    • 是的。是用来收藏的。
    【解决方案2】:

    星号用于更改默认观看行为。

    来自the angular docs

    默认情况下,$watch 方法用于跟踪更改,相等性检查基于对象标识。但是,如果对象字面量或数组字面量作为绑定表达式传递,则相等性检查是按值完成的(使用 angular.equals 函数)。也可以使用 $watchCollection 浅层观察评估值:使用 =* 或 =attr(=? 或 =*?attr,如果属性是可选的)。

    【讨论】:

    • 是的,我已经读过,你能创建一个简单的例子来证明这一点吗?
    【解决方案3】:

    根据Doc

    ==attr - 在本地范围属性和通过属性 attr 传递的表达式之间设置双向绑定。 '

    默认使用$watch方法来跟踪变化,相等性检查是基于对象身份的。

    =* 的情况下,使用 $watchCollection 浅层观察评估值。

    使用 $watch$watchCollection 的评估存在差异。

    下面的link 给出了它们之间的区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 2016-02-04
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2014-10-11
      相关资源
      最近更新 更多