【问题标题】:Reloading Controller in Angular在 Angular 中重新加载控制器
【发布时间】:2015-10-05 19:14:30
【问题描述】:

我是 Angular 的新手,我无法为这个问题找到任何可靠的答案......即使答案可能已经摆在我面前,我只是看不到它。

我有这段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 部分未刷新,并且仍显示特定内容,但应该显示另一个。 我怎样才能只重新加载这个控制器? (或者做其他事情来使这项工作按预期进行?)

希望这是有道理的......

【问题讨论】:

  • 是什么导致了全局变量的变化?是某种形式还是用户操作/HTTP 请求/等等?
  • 你不应该在 ng-show 中插入你的变量。试试:&lt;img ng-show="myvar.id == myvar.chosen"&gt; 也只在第一次加载控制器时设置,所以如果 someStaticVar 发生变化,你可以直接在你的 html 中与它进行比较或添加一个手表

标签: angularjs angular-controller


【解决方案1】:

正如@Jodevan 暗示的那样,Angular 不会意识到全局变量的变化。但是,即使它意识到了这种变化,根据您的示例,您的视图仍然不会更新,因为绑定变量 myvar.chosen 的值没有改变。换句话说,当全局变量发生变化时,您的 for 循环不会被重新计算。

要获得您想要的效果,您必须 (1) 知道全局变量何时发生更改,以及 (2) 更新 chosen 属性的值,以便模型实际更改并触发摘要。

这是一个小提琴,展示了如何使上面的代码工作:naive solution。希望了解上述 2 个要求后,您可以提出适合您的解决方案。

【讨论】:

    【解决方案2】:

    当你不直接通过 AngularJS 改变一个变量时,你必须让 AngularJS 知道这个变量被改变了。这样做的方法是使用 scope.$apply() 函数。 我认为this 可以帮助您了解幕后情况。

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2020-04-29
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多