关于角度控制器设计的问题。一个简单的例子:
考虑如下应用程序: - 两个控制器,一个管理网页的标题,一个管理主体 - 一种服务,为两个控制器提供数据。
在页面的标题中,我显示了正文中元素数量的计数。可以把它想象成经典的电子邮件收件箱:"收件箱"顶部的标签会告诉您有多少条未读消息,并且正文中列出了消息。
如果正文需要修改数据(比如删除其中一条消息),它会调用服务来执行此操作,然后执行$ emit()告诉标头控制器需要重新加载计数。
所以标题控制器的模式如下:
Service.getCount().then(function(data) {
$scope.paymentCount=data;
});
$rootScope.$on('accountDetailUpdated', function() {
Service.getCount().then(function(data) {
$scope.paymentCount=data;
});
});
实际上,应用程序更复杂;标题中有多个范围变量需要加载和更新
我的问题:标题控制器的模式似乎是多余的。我必须a)加载和b)观察,并且在两种情况下代码都非常相似。有没有更简洁的方法来实现这一目标?
答案 0 :(得分:0)
你需要定义一个由头控制器和主体控制器引用的服务。不同之处在于,您的服务不仅会提供方法,还会提供对象文字,例如收件箱。
然后在ur标题控制器中你将引用收件箱对象 和你的身体控制器相同,你将参考收件箱对象 并且在删除项目时,您的服务将更新收件箱对象。
使用这种方式你不需要发出任何广播。并且所有更改都将自动更新
例如:
服务
var _inbox={items: 20; }
getInstance = function () {
return _inbox; }
deleteItems = function () {
_inbox.items --; }
标头控制器(注入inboxservice)
var header = inboxservice.getInstance();
//define other methods depend on need
$scope.header= header;
标题HTML
<span >{{header.items}} </span> //it will show 20 at start
Body Controller(注入收件箱服务)
var body = inboxservice.getInstance();
//define other methods depend on need
$scope.body=body;
正文HTML
<a> <delete Item > //it will call delete method of inbox service </a>
因为服务将更新收件箱项目长度,您将在标题HTML中获得更改。例如,首次删除时为20到19。