加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 为什么ngIf的优先级高于{{}}(插值)?

发布时间:2020-12-17 10:26:41 所属栏目:安全 来源:网络整理
导读:设置ngIf优先级(600)高于{{}}(100)的原因是什么?不应该在ng-if属性值中允许{{}}的优先级较低吗? 我想在$scope变量中有一个条件: 控制器: app.controller('MainCtrl',function($scope,$http,$parse) { $scope.hide = "check === 'hidden'"; $scope.parsec
设置ngIf优先级(600)高于{{}}(100)的原因是什么?不应该在ng-if属性值中允许{{}}的优先级较低吗?

我想在$scope变量中有一个条件:

控制器:

app.controller('MainCtrl',function($scope,$http,$parse) {
  $scope.hide = "check === 'hidden'";
  $scope.parsecond = function (cond) {
    return $parse(cond)($scope);
  };

});

模板:

<body ng-controller="MainCtrl">
    <div ng-if="!{{hide}}">funky ng-if div</div>
    <div ng-hide="{{hide}}">ng-hide div</div>
    <div ng-if="!parsecond(hide)">ng-if div</div>
    <input type="input" ng-model="check" />
  </body>

ng-hide工作正常,因为它解析hide变量的内容并返回“check ===’hidden’”,然后由ng-hide指令进行评估.

但ng-if尝试在插值之前评估{{hide}}有机会解析字符串因此ng-if抛出异常.

我发现的唯一解决方案是调用一个函数,它基本上完成了interpolate指令的工作并返回解析的内容.

Plnkr显示问题:link

编辑:

在阅读文档之后,我发现了更好的方法,无需在$scope上使用自定义方法,因为angularjs已经有一个方法可以根据当前的$scope($eval)解析变量.

所以我的解决方案是:

<body ng-controller="MainCtrl">
    <div ng-if="!$eval(hide)">funky ng-if div</div>
    <div ng-hide="{{hide}}">ng-hide div</div>
    <div ng-if="!parsecond(hide)">ng-if div</div>
    <input type="input" ng-model="check" />
  </body>

更新了plnkr:link

虽然这仍然无法解释为什么ngIf具有更高的优先级.

编辑2:

只是让人们明白它不一样:

例如:

控制器:

$scope.value = "hi";
$scope.condition = "value === 'bye'";

HTML:

<div ng-hide="condition"></div> <!--This will be evaluated to true since !!"value ==='bye'" = true. -->
<div ng-hide="{{condition}}"></div> <!--This will be evaluated to false since value !== 'bye' = false -->
<div ng-if="condition"></div> <!--This will be evaluated to true since !!"value === 'bye'" = true. -->
<div ng-if="{{condition}}"></div> <!--This will give an exception since ngIf directive ran before interpolation directive in the $compile step. -->
<div ng-if="$eval(condition)"></div> <!--This will be evaluated to false since value !== 'bye' = false. -->

我的结论是,如果您希望指令在字符串中而不是在作用域上的属性中评估/设置监视,则使用$parse会更安全.虽然我可以将{{}}用于ng-hide / ng-show或任何优先级低于100的指令,但我猜它不安全,因为我依赖于编译顺序并且不是100 %明确表示未来的补丁不会改变.

ng-if期望它的值是一个角度表达式 – under the hood它只使用$scope.$watch.因此,如果要在范围内定义的某些变量(例如:scope.hide)中包含ng-if的内容,则在标记中添加ng-if =“hide”.这里没有双花括号.

现在回到你的问题:ng-if的优先级为600,但$interpolate是angular的服务 – 而不是指令.因此$interpolate没有定义优先级.你从哪里得到100?

UPDATE

你总是可以通过加入你的标记条件来包括ng-if的内容(比如scope.conditionFn):ng-if =“conditionFn()”.

更新2

我更新了你的PLNKR以使其正常工作.你的plunker中ng-if和ng-hide之间的不一致与$compile中发生的插值优先级无关.

更新3

看起来你是正确的插值顺序在这里发挥作用,但是…我真的没有看到任何有理由在angular的表达式内插值. ng-if具有相对较高优先级的原因在于它从/向DOM移除/添加被转换的内容,而ng-hide仅显示/隐藏被转换的内容.我认为这是一个纯粹的巧合,一个指令似乎有效,另一个没有.但是,如果你不使用不必要的,多余的技巧,两者都可以按照预期的方式工作,我的掠夺者会表现出来.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读