我有一个rootcope变量
//we keep it false here, on HTML page if any line item is displayed in edittable form,it will be initialized to True
$rootScope.varToDecideDispalyofSaveButtonOn10A =false;
我正在尝试在标记页面上初始化它
.
.
.
<tr class="BG8" ng-if="(obj.lineItemEditableForPM)" ng-init="varToDecideDispalyofSaveButtonOn10A='true'">
.
.
.
虽然ng-if这里是真的并且创建了tr,但是没有定义变量,为什么?
答案 0 :(得分:4)
ng-if
该指令创建新的子范围。这是DOC
所以你可以通过在rootScope而不是普通变量中创建一个对象来实现这个目的,然后首先angular会在子范围内搜索something.varToDecideDispalyofSaveButtonOn10A
,并在找到后在子范围内没有something.varToDecideDispalyofSaveButtonOn10A
它将搜索父范围中的something.varToDecideDispalyofSaveButtonOn10A
。但是如果你使用一个普通的变量(因为你试过没有对象),angular会知道没有任何名为varToDecideDispalyofSaveButtonOn10A
的东西,如果没有在父范围内搜索它,它将创建一个名为varToDecideDispalyofSaveButtonOn10A
的子范围变量
<tr class="BG8" ng-if="(obj.lineItemEditableForPM)" ng-init="something.varToDecideDispalyofSaveButtonOn10A=true">
控制器中的
$rootScope.something = {};
$rootScope.something.varToDecideDispalyofSaveButtonOn10A =false;
或强>
您可以通过使用$parent
(如下所示)
<tr class="BG8" ng-if="(obj.lineItemEditableForPM)" ng-init="$parent.varToDecideDispalyofSaveButtonOn10A=true">
或强>
您可以在不使用ng-init
<tr class="BG8" ng-if="(obj.lineItemEditableForPM ? (varToDecideDispalyofSaveButtonOn10A = true) : false)">
在这种情况下,您将根据varToDecideDispalyofSaveButtonOn10A
的值更改obj.lineItemEditableForPM
的值。 如果obj.lineItemEditableForPM
为真,则angular将在子范围中搜索varToDecideDispalyofSaveButtonOn10A
,然后搜索父范围。因为你不假设将变量初始化为上述两种情况。 如果obj.lineItemEditableForPM
错误,则只需return false
而不更改varToDecideDispalyofSaveButtonOn10A
的值。
答案 1 :(得分:1)
角度js中常见的陷阱是在范围中使用原始变量,并尝试从继承自它的范围中更改它(任何范围都继承自$ rootScope)。
这不起作用的原因是原始变量不是引用(只有对象和数组是引用),因此,继承的范围获取具有相同名称的新变量。
所以你应该在想要利用范围继承的时候使用一个对象(总是这样做可能是一个很好的约定):
$rootScope.SomeVars = { varToDecideDispalyofSaveButtonOn10A : false };
并在视图中
<tr class="BG8" ng-if="(obj.lineItemEditableForPM)" ng-init="SomeVars.varToDecideDispalyofSaveButtonOn10A='true'">