图案?在AngularJS服务中封装数组

时间:2013-12-28 13:14:56

标签: javascript angularjs angularjs-service

我有一个AngularJS服务,它跟踪一个项目数组,这些项目是由几个控制器通过公开的方法添加和删除的。当然,视图应始终包含最新数据。

目前我使用将数组暴露给控制器的直接解决方案,以便它们可以直接绑定到此数组。虽然它有效并且似乎是一种常见的解决方案,但它让我觉得这远非最干净的解决方案。

优选地,我想封装数组并简单地让控制器得到有关更新的通知,以便他们可以在需要时提取数据,避免控制器可以在不使用正确方法的情况下操作数组的情况。

我一直在寻找解决这个问题的模式,但找不到比现状更好的模式。任何人都可以指出我的模式吗?

    myapp.service('favoritesService', ['$http', '$q', function(http, q) {

    var favorites = null;
    var self = this;

    this.receiveFavorites = function(forceReload) {
        if(forceReload || favorites === null) {
            return http.get('/user/favorites').then(function (returnData) {
                    favorites = angular.copy(returnData.data.favorites, favorites);
                    return favorites;
                });
        } else {
            var deferred = q.defer();
            deferred.resolve(favorites);
            return deferred.promise;
        }
    };

    this.addFavorite = function(path) {
        if(!path || !path.length)
            return q.reject("No path provided");
        var favId = getIdForPath(path);
        if(favId !== null) {
            var deferred = q.defer();
            deferred.resolve(favId);
            return deferred.promise;
        }
        var name = new Path(path).basename();
        return http.put('/user/favorite.json', 
                        {   path: path,
                            name: name
                        }).then(function(returnData) {
                            return self.receiveFavorites(true);
                        })
    },

    this.removeFavorite = function(path) {
        var favIndex = getIndexForPath(path);
        var favId = favorites[favIndex]._id.toString();
        if(favIndex === null || favId === null)
            return q.reject("Favorite doesn't exist");

        return http.delete('/user/favorites/' + favId).success(function(data) {
            favorites.splice(favIndex, 1);
        });
    };
}]);

0 个答案:

没有答案