2015-10-05 114 views
0

我是一个角度新手,我一直没有找到任何可靠的答案这个问题...即使答案可能在我面前,我只是看不到它。角度重新加载控制器

我有这一块的html:

<ul class="wrapper" ng-controller="MyController as vks"> 
    <li ng-repeat="myvar in vks.vk" class="padding-left" data-myvar-id="{{myvar.id}}"> 
     <img src="images/someimage.svg" ng-show="{{myvar.id}} == {{myvar.chosen}}" class="some-class"> 
     <a class="hvr-underline-reveal">{{myvar.name}}</a> 
    </li> 
    </ul> 

这是我的控制器:

app.controller('MyController', function() { 

    var i = 0; 
    var tmp = []; 
    for (var key in someObject) { 
     if (someObject.hasOwnProperty(key)) { 
     var obj = someObject[key]; 
     if (obj.checked) { 
      tmp[i] = {name: obj.name, id: obj.id, chosen: someStaticVar}; 
      i++; 
     } 
     } 
    } 
    this.vk = tmp; 

    }); 

我希望把重点放在这其中一部分作品首次加载页面:

<img ng-show="{{myvar.id}} == {{myvar.chosen}}"> 

突然{{myvar.chosen}}(它是从静态全局变量中设置的)发生了什么变化方javascript? HTML部分不刷新,具体仍然显示,但它应该是另一个显示。 我该如何重新加载这个控制器? (或做其他事,使这项工作的吗?)

希望这是有道理...

+0

是什么导致全局变量的变化?它是一些排序或用户操作/ HTTP请求/等? –

+1

你不应该在ng-show中插入你的变量。试试:''也选择只在第一次加载控制器的时候设置,所以如果someStaticVar改变了,你可以直接在你的html中比较它,或者添加一个手表 – masimplo

回答

1

正如@Jodevan所暗示的,Angular不会意识到全局变量的变化。但即使它已经意识到这一变化,根据你的例子,你的视图仍然不会更新,因为绑定变量myvar.chosen的值没有变化。换句话说,当全局变量改变时,你的for循环没有被重新评估。 (1)知道全局变量何时发生变化以及(2)更新chosen属性的值,以便模型实际更改并触发摘要。要获得所需的效果,您必须(1)知道全局变量何时发生更改并且(2)更新chosen属性的值,以便模型实际更改并触发摘要。

下面是一个小提琴,展示了如何使上面的代码可以工作:naive solution。希望知道上面的两个要求,你可以想出一个适合你的解决方案。

1

每当你无法直接通过AngularJS改变一个变量,你必须让AngularJS知道这个变量发生了变化。要做到这一点的方法是使用范围$ apply()函数。 我认为this可以帮助你理解发生了什么。