带有$ rootScope变量的ng-init,初始化问题

时间:2014-12-23 07:00:35

标签: javascript angularjs

我有一个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,但是没有定义变量,为什么?

2 个答案:

答案 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的值。

这是Demo Plunker

答案 1 :(得分:1)

角度js中常见的陷阱是在范围中使用原始变量,并尝试从继承自它的范围中更改它(任何范围都继承自$ rootScope)。

这不起作用的原因是原始变量不是引用(只有对象和数组是引用),因此,继承的范围获取具有相同名称的新变量。

所以你应该在想要利用范围继承的时候使用一个对象(总是这样做可能是一个很好的约定):

$rootScope.SomeVars = { varToDecideDispalyofSaveButtonOn10A : false };

并在视图中

<tr class="BG8" ng-if="(obj.lineItemEditableForPM)" ng-init="SomeVars.varToDecideDispalyofSaveButtonOn10A='true'">