AngularJS表达式为什么不懒惰地评估,导致“令牌'未定义'不是主要表达式”

时间:2013-07-27 18:25:53

标签: angularjs

This Plunker在评估期间说明了“令牌未定义'而不是主要表达式”错误(在控制台上可见):

<div ng-repeat="auimodelField in uimodel.fields" ng-show="!auimodelField.showOnlyIf || {{auimodelField.showOnlyIf}}">

我的想法/希望是,如果没有auimodelField.showOnlyIf(未定义),它将不会继续评估,因为我期望AngularJS表达式评估服务有一些懒惰,但显然,在这种情况下,这不起作用

有解决方案吗? (一种可能的“解决方法”是在模型中总是有一个showOnlyIf,当然在this Plunker中;但这是一种耻辱。)

提交有关此问题的错误/增强请求GitHub是否值得?

1 个答案:

答案 0 :(得分:4)

带有混合表达式和插值的ng-show对我来说似乎很可疑;我可能会更明确地谈谈它:

<div ng-repeat="auimodelField in uimodel.fields"
  ng-show="shouldShow(auimodelField.showOnlyIf)">
$scope.shouldShow = function(expr) {
  return !expr || $scope.$eval(expr);
};

示例:http://plnkr.co/edit/Zxx9kW?p=preview

<强> [更新]

我确实遇到过这个GitHub问题:https://github.com/angular/angular.js/issues/433但我相信你的问题是插值首先发生,并且解析器将其识别为无效表达式(在事件尝试运行之前)。 / p>

在这种情况下,这应该(并确实)解决问题:

<div ng-repeat="auimodelField in uimodel.fields"
  ng-show="!auimodelField.showOnlyIf || {{auimodelField.showOnlyIf || false}}">