Angularjs   发布时间:2022-04-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了AngularJS:控制器和工厂/服务应该如何使用丰富的分层对象模型进行结构化?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我读了这两个伟大的文章

The state of angularjs controllers通过Jonathan Creamer

Rethinking AngularJS Controllers由Todd Motto

在这文章中,作者讨论了使用控制器的正确方法(使它们成为视图和模型之间的贫民桥)和工厂/服务(业务逻辑应该真正存在)。

这是伟大的信息,我真的很兴奋开始重构我的项目中的控制器,但我很快发现,如果你有一个丰富的对象模型,文章显示的结构分解。

这里是从“重新思Angularjs控制器”的设置的一个回顾:

这里是控制器:

app.controller('InBoxCtrl',function InBoxCtrl (InBoxFactory) {

    var vm = this;

    vm.messages = InBoxFactory.messages;

    vm.openmessage = function (messagE) {
      InBoxFactory.openmessage(messagE);
    };

    vm.deletemessage = function (messagE) {
      InBoxFactory.deletemessage(messagE);
    };

    InBoxFactory
      .getmessages()
      .then(function () {
      vm.messages = InBoxFactory.messages;
    });

});

和这里的工厂:

app.factory('InBoxFactory',function InBoxFactory ($LOCATIOn,NotificationFactory) {

  factory.messages = [];

  factory.openmessage = function (messagE) {
    $LOCATIOn.search('id',message.id).path('/message');
  };

  factory.deletemessage = function (messagE) {
    $http.post('/message/delete',messagE)
    .success(function (data) {
      factory.messages.splice(index,1);
      NotificationFactory.showsuccess();
    })
    .error(function () {
      NotificationFactory.showError();
    });
  };

  factory.getmessages = function () {
    return $http.get('/messages')
    .success(function (data) {
      factory.messages = data;
    })
    .error(function () {
      NotificationFactory.showError();
    });
  };

  return factory;

});

这是伟大的,因为提供程序(工厂)是单例,数据在视图中维护,可以访问,而不必从API重新加载它。

这工作很好,如果消息是顶级对象。但是如果不是,会发生什么?如果这是用于浏览其他用户的收件箱的应用程序,该怎么办?也许您是管理员,您希望能够管理和浏览任何用户的收件箱。也许您需要同时加载多个用户的收件箱。这个怎么用?问题是收件箱消息存储在服务中,即InBoxFactory.messages。

如果层次结构是这样的

Organization
                                |
              __________________|____________________
             |                  |                    |
         AccounTing       Human resources            IT
             |                  |                    |
     ________|_______      _____|______        ______|________
    |        |       |    |     |      |      |      |        |
   John     Mike    Sue  Tom   Joe    Brad   May    Judy     Jill
    |        |       |    |     |       |     |      |        |
   InBox    InBox  InBox InBox InBox  InBox InBox  InBox    InBox

现在消息是层次结构中的几个级别,并且没有自己的意义。您不能在工厂中存储消息,InBoxFactory.messages,因为您必须一次检索多个用户的消息。

现在你将有一个OrganizationFactory,一个DepartmentFactory,一个UserFactory和一个InBoxFactory。检索“消息”必须在用户的上下文中,该用户在部门的上下文中,该部门在组织的上下文中。数据如何存储和在哪里存储?应该如何撤回?

那么应该如何解决呢?如何构建控制器,工厂/服务和丰富的对象模型?

在我的想法的这一点上,我倾向于保持精益,没有一个丰富的对象模型。只需将对象存储在注入到控制器中的$ scope上,如果您导航到新视图,则从API重新加载。如果你需要跨视图持久化一些数据,你可以用服务或工厂来构建这个桥梁,但它不应该是你做大多数事情的方式。

其他人怎么解决这个?有什么样的模式吗?

您可以使用丰富的对象模型,但对于非顶级对象,他们的工厂应该公开一个api来创建新的实例,而不是用作单例。这是有点违反了许多应用程序的设计,你看到这些天,这是更多的功能比面向对象 – 我不评论两种方法的利弊,我不认为Angular的力量你采用非此即彼。

您的示例,重新设计,在伪代码

app.controller('InBoxCtrl',function InBoxCtrl (InBoxFactory) {

   var inBox = InBoxFactory.createInBox();

   $scope.getmessages = function(){
      inBox.getmessages()
           .then(...)

   $scope.deletemessages = function(){
      inBox.deletemessages()
           .then(...)

});

大佬总结

以上是大佬教程为你收集整理的AngularJS:控制器和工厂/服务应该如何使用丰富的分层对象模型进行结构化?全部内容,希望文章能够帮你解决AngularJS:控制器和工厂/服务应该如何使用丰富的分层对象模型进行结构化?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。