【问题标题】:AngularJS service architectureAngularJS 服务架构
【发布时间】:2015-07-03 01:44:57
【问题描述】:

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

Full Plunk

基础 - 这很好用:

.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 过程自动进行,以便每次获取新用户时都会擦除集合?

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

【问题讨论】:

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

标签: javascript angularjs architecture circular-dependency


【解决方案1】:

最终使用了这篇文章中的最佳解决方案:

angular JS - communicate between non-dependend services

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

【讨论】:

    猜你喜欢
    • 2017-03-26
    • 2011-10-02
    • 2016-04-03
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多