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(...) }); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |