Angularjs 什么';当使用ng show/hide时,使用{{}与不使用{{}之间的区别是什么

Angularjs 什么';当使用ng show/hide时,使用{{}与不使用{{}之间的区别是什么,angularjs,ng-show,Angularjs,Ng Show,当我尝试进行自动显示/隐藏时,我发现如果在属性值表达式中使用{{},DOM的初始状态是正确的,但是当我更新模型时,视图还没有更新,“ng hide”类还没有添加到DOM中,即使属性的值被正确地更新为“false”。不正确的DOM如下所示: <p class="grey-text" ng-show="false">no data</p> 无数据 但是如果我不使用{},类可以正确更新。指令ng show(以及大多数指令,包括自定义指令)接受表达式作为参数 {{}运

当我尝试进行自动显示/隐藏时,我发现如果在属性值表达式中使用{{},DOM的初始状态是正确的,但是当我更新模型时,视图还没有更新,“ng hide”类还没有添加到DOM中,即使属性的值被正确地更新为“false”。不正确的DOM如下所示:

    <p class="grey-text" ng-show="false">no data</p>

无数据


但是如果我不使用{},类可以正确更新。

指令
ng show
(以及大多数指令,包括自定义指令)接受表达式作为参数

{{}
运算符为。将计算插值运算符内的表达式,并输出文本。无法保证在指令评估数据之前完成此插值

•不能保证它适用于每个指令,因为插值本身就是一个指令。如果另一个指令在插值运行之前访问属性数据,它将获取原始插值标记,而不是数据

它也是多余的,因为该指令已被设计为在计算结果之前获取表达式并对其执行插值。如果插值发生在指令之前,则结果如下:

  • 插值
    {{myVar}}
    并返回结果
  • 将结果
    'false'
    写入DOM
  • 指令从DOM读取
    'false'
  • 指令插入
    'false'
    ,返回
    false
  • 相反,您需要更自然的流动:

  • 指令从DOM读取
    myvar
  • 指令插入
    myvar
    ,返回
    false
  • 进一步澄清:


    所有这些插值和求值都发生在一个
    $digest
    周期中。插值和更新DOM不会改变表达式的值,只会改变它的显示方式。因此,插值不会触发
    $watch
    或新的
    $digest
    ,如果指令没有看到某种形式的值,它们就无法知道。因此,指令必须接受原始表达式并自行执行插值,以确保结果准确。

    我认为插值工作流程仍在$apply中,因此将监视属性值的更改,除非属性值没有更改。不,您误解了。插值是一个具有优先级的指令,其他具有更高优先级的指令可能会在更新值之前检查该值,并且永远不会知道该值已更改。结果是您在DOM中看到了更新,但指令没有对其进行操作。由于这个原因,指令的设计不是为了使用语法。这同样适用于其他指令,如ngInit