角控制器模式

时间:2014-04-05 11:23:40

标签: angularjs

关于角度控制器设计的问题。一个简单的例子:

考虑如下应用程序: - 两个控制器,一个管理网页的标题,一个管理主体 - 一种服务,为两个控制器提供数据。

在页面的标题中,我显示了正文中元素数量的计数。可以把它想象成经典的电子邮件收件箱:"收件箱"顶部的标签会告诉您有多少条未读消息,并且正文中列出了消息。

如果正文需要修改数据(比如删除其中一条消息),它会调用服务来执行此操作,然后执行$ emit()告诉标头控制器需要重新加载计数。

所以标题控制器的模式如下:

Service.getCount().then(function(data) {
    $scope.paymentCount=data;
     });

$rootScope.$on('accountDetailUpdated', function() {
    Service.getCount().then(function(data) {
            $scope.paymentCount=data;
    });                     
});

实际上,应用程序更复杂;标题中有多个范围变量需要加载和更新

我的问题:标题控制器的模式似乎是多余的。我必须a)加载和b)观察,并且在两种情况下代码都非常相似。有没有更简洁的方法来实现这一目标?

1 个答案:

答案 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。