我正在与AngularJS合作完成我的最新项目.在文档和教程中,所有模型数据都放入控制器范围.我知道必须存在控制器,因此在相应的视图中.
但是,我不认为该模型应该在那里实施.它可能很复杂并且具有私有属性.此外,人们可能希望在另一个上下文/应用程序中重用它.将所有内容放入控制器完全打破了MVC模式.
对于任何模型的行为都是如此.如果我使用DCI架构并从数据模型中分离行为,我将不得不引入其他对象来保存行为.这可以通过引入角色和上下文来完成.
当然,模型数据和行为可以使用普通的javascript对象或任何"类"模式来实现.但AngularJS的做法是什么呢?使用服务?
所以它归结为这个问题:
在AngularJS最佳实践之后,您如何实现与控制器分离的模型?
AngularJS在其文档中明确指出服务是单身人士:
AngularJS services are singletons
Run Code Online (Sandbox Code Playgroud)
与直觉相反,module.factory也返回一个Singleton实例.
鉴于非单例服务有很多用例,实现工厂方法返回服务实例的最佳方法是什么,这样每次ExampleService声明一个依赖项时,它都会被一个不同的实例所满足ExampleService?
我刚开始使用AngularJS,所以我不是专家.
我有一个div代表我的html视图的正确区域.在那个div我有一个控制器,即
<div class="rightContainer" ng-controller="rightContainerCtrl">...</div>
Run Code Online (Sandbox Code Playgroud)
在div中我有一个表,一个搜索区域等.该div中的每个区域都有自己的控制器,它看起来像这样:
<div class="rightContainer" ng-controller="rightContainerCtrl">
...
<div class="search" ng-controller="searchCtrl">...</div>
...
<div class="table" ng-controller="tableCtrl">...</div>
</div>
Run Code Online (Sandbox Code Playgroud)
例如,搜索区域有自己的控制器,它是rightContainerCtrl的子节点,因为它需要改变父节点中的某些内容(rightContainerCtrl),但是rightContainer div正在增长,现在它很大,并且包含几个嵌套控制器.
我认为使用这个嵌套控制器在这个上下文中是不好的,因为所有嵌套控制器共享父作用域,并不是所有控制器都需要访问所有父作用域变量,所有控制器都是rightContainerCtrl的"囚犯",所以它们是与其父控制器高度耦合.
它看起来像一个上帝对象反模式(在这种情况下是上帝控制器),所以我认为不是使用嵌套控制器我可以重构我的代码以消除rightContainerCtrl控制器并改为使用服务(如在外观设计模式中),然后,控制器将使用该服务,而不是共享范围变量.
但由于我不是AngularJs的专家,我不确定我是对的还是离开这个父控制器更好,也许我错过了什么,所以我的问题是
何时更好地使用嵌套控制器(嵌套范围)以及何时更好地在angularjs中使用服务?
对不起,标题含糊不清;
我一直在重构我的一些AngularJS代码,试图更加"Angular",并且我注意到这种模式突然出现了:
app.service("someService", function(...) {
...
}
app.controller("ControllerForThisSection", function($scope, someService) {
$scope.someService = someService
}
Run Code Online (Sandbox Code Playgroud)
基本上,控制器主要是为范围提供服务的引用,因此视图可以使用它,例如
<div ng-if="someService.status">
....
</div>
Run Code Online (Sandbox Code Playgroud)
因此,我有多个控制器除了依赖某些共享数据或服务之外什么都不做,并且用于引用通过作用域可用的那些服务.
使用这种设计有什么不利之处吗?我能改进思考吗?这是"有角度"的方式吗?
谢谢你的建议!
javascript design-patterns angularjs angularjs-service angularjs-scope
angularjs ×4
javascript ×2
dci ×1
factory ×1
god-object ×1
instance ×1
service ×1
singleton ×1