角度服务/模型数据和控制器:如何共享数据

时间:2015-05-13 08:22:51

标签: angularjs

所以我得到了一个服务和控制器的地方。该服务从数据源读取/写入数据,控制器知道该数据。一切都是好的。

除了我心中的唠叨思想。服务通知控制器有修改数据的最佳方法是什么?

目前,我在服务中有(简单的伪代码):

 var data = {
        items: [],
        item: {}
    }
// read & write functions to the dataSource : ***data.items*** gets populated with the list of records from the db

function find(id) {
 //find appropriate item, ***data.item*** gets populated 
 // with the record

function save() {
  // write data.item to the db
}
我们在控制器中

{ // service is injected as a dependency        
controller.service = service
controller.data = controller.service.data

controller.save = function() {
        controller.service.save()
}

// etc etc

这一切都很好。我必须强调,我的所有ui绑定都能正常工作,而且效果很好。

然而,

a)我对服务所处的国家感到不安 b)我不确定让控制器指向服务所持有的数据是将两者连接在一起的最佳方式。

a)控制器将对象作为参数传递给保存函数

会更好吗?
    controller.save = function() {
      service.save(controller.data.item)

b)不是直接访问服务数据,服务是否更好地广播包含数据和控制器的消息来订阅此消息?

我想我正在把问题归结为:

发送和发送服务是否更好?接收数据,或控制器是否可以直接访问服务数据?

感谢

3 个答案:

答案 0 :(得分:1)

为了通知您的工厂或服务的其他实例,您必须触发事件或使用角度的$ watch功能。

Here is example

答案 1 :(得分:0)

根据我对Controller-Service模型的理解,该服务不是事件驱动的。按事件,我指的是启动事件的用户操作(例如鼠标单击)。这种事件驱动的行为是视图的控制器。但是在服务中,理想情况下应该与服务器(后端)通信以读取,修改或删除数据。或者它可能包含为正常CRUD以外的任何特殊目的而调用的Web服务。它拥有的数据是服务响应的结果。服务是视图控制器(在客户端/浏览器上)和后端(与客户端通信的Web服务)之间的外观。

事件发布和订阅是从指令到控制器,或控制器到另一个控制器等。

答案 2 :(得分:0)

这样想,如果你知道什么时候想要从服务中读取,那么就没有必要使用$ broadcast。在一天结束时,您可以更好地控制正在发生的事情,因为广播会在您的范围内传播事件,因此可能更容易出错。

如果您希望示波器和任何子示波器在事件上执行某些操作,那么将使用$ broadcast是一种好方法。

在您的示例中,如果数据未在应用程序中的任何其他位置使用。然后你可以将它保存在控制器中。该服务将帮助您与其他指令或控制器共享数据。此外,它允许您使用业务逻辑来拒绝/解决来自服务器的响应,该响应将与控制器分开。

您的控制器

var data = service.getData(); 

find(id); save(id);

您的服务

 getData: {
      return // data from db;
  }