Angular指令绑定到工厂

时间:2016-03-10 16:26:08

标签: angularjs

我正在使用sbAdmin模板开发一个基于Angular的管理仪表板(我找到了sbAdmin-angular模板)......

问题是我有一个工厂,我从服务器获取数据,控制器可以询问数据(在上次更新中提取)或要求工厂更新它们:

app.factory("appData", function($http, $q) {
    var data = null;

    var getData = function() {
        var defered = $q.defer();
        var promise = defered.promise;
        if (!data) {
            console.log("Fetching data")
            updateData().then(function(data) {
                defered.resolve(data);
            });
        } else {
            defered.resolve(data);
        }
        return promise;
    }

    var updateData = function() {
        var defered = $q.defer();
        var promise = defered.promise;

        $http.get('/appData').success(function(response) {
            //Retrieve the data
            data = response;
            defered.resolve(data);
        })});
        return promise;
    }

    return {
        getData: getData,
        updateData: updateData
    };
})

当我更新数据时,每个州使用的控制器,绑定运行良好。但我有一个使用指令实现的侧边栏:

angular.module('sbAdminApp')
    .directive('sidebar', ['$location', function() {
        return {
            templateUrl: 'scripts/directives/sidebar/sidebar.html',
            restrict: 'E',
            replace: true,
            scope: {},
            controller: function($scope, appData) {
                ... bla, bla, bla...

                appData.getData().then(function(data) {
                    $scope.appData = data;
                })

                ... bla, bla, bla...
            }
        }
    }]);

任何人都知道为什么在指令中,工厂(单例)数据不像控制器那样更新?

感谢您的建议!

1 个答案:

答案 0 :(得分:1)

请注意,在updateData()中,如果您从请求中收到错误,则您的承诺既不会解决也不会拒绝。我的猜测是你得到一个错误,因为你没有处理它,请求永远不会完成。

确保updateData解析或拒绝。通过返回您的承诺而不是创建新的承诺,它可以变得更简单。不要使用已弃用的success方法,只需将结果视为普通承诺(与then略有不同,您必须自己提取response.data {{1}将响应拆分为单独的参数):

success

var updateData = function() { return $http.get('/appData').then(function(response) { //Retrieve the data data = response.data; return data; }); } 也可以简化:

getdata

现在来自var getData = function() { if (!data) { console.log("Fetching data") return updateData(); } else { return $q.resolve(data); } } 调用的任何错误都会一直冒回到你的指令,你可以在那里处理它。