我有一个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);
});
};
}]);