Перезагрузка контроллера в угловой

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}} (который установлен из статического глобального var) изменяется с некоторого внешнего javascript? Часть HTML не обновляется, и эта спецификация все еще отображается, но она должна быть другой. Как я могу перезагрузить только этот контроллер? (или сделать что-то еще, чтобы сделать эту работу по назначению?)

Надеюсь, это имеет смысл...

  • 0
    Что вызывает изменение глобальной переменной? Это какое-то действие или действие пользователя / HTTP-запрос / и т.д.?
  • 1
    Вы не должны интерполировать ваши переменные в ng-show. Попробуйте: <img ng-show="myvar.id == myvar.chosen"> Также выбран будет установлен только тогда, когда контроллер загружается в первый раз, так что если someStaticVar изменяется, вы можете сравнить с ним непосредственно в вашем HTML или добавить часы к нему
Теги:

2 ответа

1
Лучший ответ

Как намекнул @Jodevan, Angular не будет знать об изменении глобальной переменной. Но даже если бы это стало известно об этом изменении, на основе вашего примера ваше представление все равно не будет обновляться, поскольку значение связанной переменной myvar.chosen не изменяется. Другими словами, ваш цикл for-loop не переоценивается при изменении этой глобальной переменной.

Чтобы получить желаемый эффект, вам нужно (1) знать, когда изменилась глобальная переменная, и (2) обновить значение chosen свойства, чтобы модель фактически изменилась и инициировала дайджест.

Здесь скрипка, показывающая, как можно сделать код выше: наивное решение. Надеюсь, зная два вышеуказанных требования, вы можете придумать решение, которое будет работать для вас.

1

Всякий раз, когда вы изменяете переменную не напрямую через AngularJS, вы должны позволить AngularJS знать, что эта переменная была изменена. Способ сделать это - использовать область действия. $ Apply(). Я думаю, это поможет вам понять, что происходит под капотом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню