Я новичок в ракурсе, и я не смог найти твердых ответов на этот вопрос... хотя ответ мог быть передо мной, я просто не мог его увидеть.
У меня есть эта часть 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 не обновляется, и эта спецификация все еще отображается, но она должна быть другой. Как я могу перезагрузить только этот контроллер? (или сделать что-то еще, чтобы сделать эту работу по назначению?)
Надеюсь, это имеет смысл...
Как намекнул @Jodevan, Angular не будет знать об изменении глобальной переменной. Но даже если бы это стало известно об этом изменении, на основе вашего примера ваше представление все равно не будет обновляться, поскольку значение связанной переменной myvar.chosen
не изменяется. Другими словами, ваш цикл for-loop не переоценивается при изменении этой глобальной переменной.
Чтобы получить желаемый эффект, вам нужно (1) знать, когда изменилась глобальная переменная, и (2) обновить значение chosen
свойства, чтобы модель фактически изменилась и инициировала дайджест.
Здесь скрипка, показывающая, как можно сделать код выше: наивное решение. Надеюсь, зная два вышеуказанных требования, вы можете придумать решение, которое будет работать для вас.
Всякий раз, когда вы изменяете переменную не напрямую через AngularJS, вы должны позволить AngularJS знать, что эта переменная была изменена. Способ сделать это - использовать область действия. $ Apply(). Я думаю, это поможет вам понять, что происходит под капотом.
<img ng-show="myvar.id == myvar.chosen">
Также выбран будет установлен только тогда, когда контроллер загружается в первый раз, так что если someStaticVar изменяется, вы можете сравнить с ним непосредственно в вашем HTML или добавить часы к нему