У меня есть следующая услуга
function PathFactory() {
this.path = null;
this.setPath = function(path) {
this.path = path;
}
return this;
}
Мой контроллер навигации:
function NavController($scope, PathFactory) {
list = document.getElementsByTagName("ul");
list = list[0];
var items = list.getElementsByTagName("li");
for(var i = 0 ; i < items.length ; i++) {
items[i].setAttribute("navIndex", i);
items[i].addEventListener("click", navClick);
}
function navClick(e) {
switch(e.path[1].hash) {
case "#home":
PathFactory.setPath("home");
break;
case "#bots":
PathFactory.setPath("bots");
break;
case "#servers":
PathFactory.setPath("servers");
break;
case "#status":
PathFactory.setPath("status");
break;
}
}
}
И мой контроллер контента:
function ContentController($scope, PathFactory) {
$scope.$watch(function() {
return PathFactory.path;
}, function (newValue) {
alert("changed value");
});
}
$ Scope. $ Watch не запускает функцию, если значение PathFactory.path должно быть изменено контроллером навигации, каким-либо образом я могу заставить эту настройку работать?
Привет, ребята.
Если вы хотите, чтобы AngularJS вызывал метод $watch()
, вам нужно вызвать метод $apply()
вручную.
Угловая двусторонняя привязка данных работает только потому, что все, что меняет что-либо в $scope
также вызывает метод $apply
. Таким образом Angular знает, что что-то изменилось.
Попытайтесь поместить эту строку кода $scope.$apply();
в конце вашей функции navClick
.
Но вы обязательно должны использовать директиву для прослушивателей событий и/или DOM-Manipulation
navClick
может быть более динамичной, если вы переключите переключатель следующим образом: PathFactory.setPath(e.path[1].hash.substr(1));