Javascript AngularJS服务架构

Javascript AngularJS服务架构,javascript,angularjs,architecture,circular-dependency,Javascript,Angularjs,Architecture,Circular Dependency,我发现自己在我的服务中遇到了一些循环依赖性问题,这可能意味着它们只是构建不正确 基础知识-这很好用: .factory('bookCollection', function($http, urls, user) { var books = []; return { data: books, getBooks: getBooks, reset: resetCollection, addBoo

我发现自己在我的服务中遇到了一些循环依赖性问题,这可能意味着它们只是构建不正确

基础知识-这很好用:

.factory('bookCollection', function($http, urls, user) {
      var books = [];

      return {
          data: books,
          getBooks: getBooks,
          reset: resetCollection,
          addBook: addToCollection
      };

      ///////////////////////////////////

      function getBooks() {
          var params = { 
            user: user.current
          };

          return $http.get(urls.getBooks, { params: params })
              .then(function(res) {
                  books = res.data;
                  return books;
              });
      }

      function resetCollection() {
          books = [];
      }

      function addToCollection(book) {
          books.push(book);
          persistCollection(books);
      }

      function persistCollection(books) {
          return $http.post(urls.postBooks, books)
              .then(function(res) {
                  return res.status;
              });
      }
})

.factory('user', function($http, urls) {
      var currentUser = {};

      return {
          current: currentUser,
          getUser: fetchCurrentUser
      };

      ///////////////////////////////////

      function fetchCurrentUser(userId) {
          return $http.get(urls.getUser, { params: { id: userId }})
              .then(function(res) {
                    angular.copy(res.data, currentUser);
              });
      }
});
现在,我想介绍在获取新用户时重置当前
bookCollection
的功能。但是如果我将
bookCollection
添加为
user
的依赖项,那么我将创建一个循环依赖项

我还可以如何使此
bookCollection.reset
过程自动进行,以便每次获取新用户时都擦除集合


另外,作为旁注,我想知道my bookCollection.data是否应该是独立于与服务器交互的方法的自己的服务,因为一个只是数据的“存储”,另一个是通信层。

最后使用了本文中的顶级解决方案:


基本上创建了第三个服务,用作“事件总线”,并促进服务之间的通信,而无需在控制器中重复方法调用或过度使用
$rootScope

,这可能应该在控制器中处理。服务应该只知道获取数据。@PaulNispel您可能是对的,但这似乎与广告中的相反。首先,如果我在应用程序中有很多地方重置了该用户,那么我会重复代码。其次,这个动作永远不会影响视图的范围,所以我觉得控制器不是正确的选择。角度模块之间的通信是一个没有很好解决的问题。有三种解决方案:1)进入第三个工厂,该工厂只存储当前用户的状态,收听此状态并在更改时更新书店2)使用$rootScope broadcast/emit 3)在您的控制器中进行处理保罗是对的。这看起来像是viewmodel/controller的一部分。您还可以将用户直接传递到getBooks,它完全删除了模块依赖关系。@mikalai虽然在这个简单的示例中,将其放在控制器中似乎不是什么大不了的事情,但是如果整个应用程序中有9个调用
fetchCurrentUser
的位置,会发生什么情况,在这些地方,控制器需要手动调用
resetCollection
?如果新开发人员开始项目,他们需要知道,每次调用
fetchCurrentUser
时,您还必须调用
resetCollection
?对我来说,这似乎值得怀疑。