角度表厂价值

时间:2015-07-15 14:12:31

标签: javascript angularjs data-binding angularjs-scope angularjs-service

说我有以下工厂:

app.factory("categoryFactory", function (api, $http, $q) {    
    var selected = null;
    var categoryList = [];
    return {
        getList: function () {
            var d = $q.defer();
            if(categoryList.length  <= 0){
                $http.get(api.getUrl('categoryStructure', null))
                    .success(function (response) {
                        categoryList = response;
                        d.resolve(categoryList);
                    });
            }
            else
            {
                d.resolve(categoryList)
            }
            return d.promise;
        },
        setSelected: function (category) {
            selected = category;
        },
        getSelected: function () {
            return selected;
        }
    }    
});

现在我有两个控制器同时使用这个工厂。因此,在更新时必须通知两个控制器,我尝试了以下内容:

    app.controller('DashboardController', ['$http', '$scope', '$sessionStorage', '$log', 'Session', 'api','categoryFactory', function ($http, $scope, $sessionStorage, $log, Session, api, categoryFactory) {

    $scope.selectedCategory = categoryFactory.getSelected();

}]);

虽然我的其他控制器看起来像这样:

    app.controller('NavController', ['$http', '$scope', '$sessionStorage', '$log', 'Session', 'api', 'FileUploader', 'categoryFactory', function ($http, $scope, $sessionStorage, $log, Session, api, FileUploader, categoryFactory) {
    $scope.categories = [];

    categoryFactory.getList().then(function (response) {
        $scope.categories = response;
    });
    $scope.selectCategory = function (category) {
        categoryFactory.setSelected(category);
    }

}]);

NavController如何更改DashboardController

中未更改的值

我的问题是,当价值发生变化时,如何watch或以其他方式获得通知?

1 个答案:

答案 0 :(得分:2)

您可以使用observer模式,如下所示:

app.factory("categoryFactory", function (api, $http, $q) {   
    // the list of callbacks to call when something changes
    var observerCallbacks = []; 

    // ...

    function notifyObservers() {
        angular.forEach(observerCallbacks, function(callback) {
            callback();
        });
    }

    return {
        setSelected: function (category) {
            selected = category;
            // notify the observers after you change the value
            notifyObservers();
        },
        registerObserver: function(callback) {
            observerCallbacks.push(callback);
        }
    }    
});

然后在你的控制器中:

app.controller('NavController', ['$http', '$scope', '$sessionStorage', '$log', 'Session', 'api', 'FileUploader', 'categoryFactory', function ($http, $scope, $sessionStorage, $log, Session, api, FileUploader, categoryFactory) {
    // ...

    // init
    (function() {
        categoryFactory.registerObserver(function() {
            categoryFactory.getList().then(function (response) {
                $scope.categories = response;
            });
        });
    })();

}]);

这样,只要调用setSelected,它就会调用您在observerCallbacks中注册的每个回调。您可以从任何控制器注册这些,因为工厂是单身人士,他们将始终知道。

编辑:只是想添加我可能已将notifyObservers()调用放在错误的区域(目前位于setSelected)并且我可能放错了更新在控制器中调用(当前为getList)但架构保持不变。在registerObserver中,在更新值时添加您想要执行的操作,以及您希望观察者了解有关调用notifyObservers()

的更改的位置