angularjs监视由另一个控制器制作的范围变量的变化

时间:2015-08-19 12:27:31

标签: javascript angularjs

我有以下服务

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");
    });

}

如果导航控制器改变PathFactory.path的值,$ scope。$ watch没有运行该函数,我可以通过任何方式使这个设置工作吗?

干杯。

1 个答案:

答案 0 :(得分:2)

如果您希望AngularJS调用$watch()方法,则必须手动调用$apply()方法。

Angulars双向数据绑定仅适用,因为$scope中任何更改内容的内容都会调用$apply方法。就这样,Angular知道事情发生了变化。

尝试将此行代码$scope.$apply();放在navClick函数的末尾。

但是你绝对应该使用指令进行事件监听器和/或DOM-Manipulation