在angularjs中共享和保存来自多个控制器的数据

时间:2014-09-11 12:58:16

标签: javascript angularjs

我似乎无法找出解决这个问题的方法:

我有多个角度控制器,他们都需要一个用户对象,他们可以操作,并且每次操作时都会被操纵#34; new"数据也需要在其他控制器中输出。同时我需要将此用户对象保存在数据库中以便以后进行检索(因此在用户对象上更改数据时自动保存功能)

但我似乎无法弄清楚我是应该使用工厂还是服务来保存这个用户对象,以及如何通过API将这个工厂/服务用于保存用户更改。

我读了这个Sharing ajax data between multiple controllers in angular using service示例,他想要完成一些相同的事情,但API部分和异步自动保存真的给了我麻烦!

底线是,我有多个控制器需要来自服务器端的用户对象。并且这些控制器使用相同的用户对象进行操作,并且在每次操作之后(可能有一些去抖动),我想通过API将对象保存到数据库。

(首先,我想到在服务/工厂看对象,但发现我不能:()

你们能指出我正确的方向吗?

4 个答案:

答案 0 :(得分:1)

是否创建服务或工厂确实是一个设计问题。

您可能希望查看$resourceRestangularThickM等库,这些库可帮助您创建将模型与API端点相关联的服务,以便进行提取和保存。

异步自动保存可以在服务中或在控制器上解决。

披露:我是ThickM的作者。

答案 1 :(得分:1)

  1. 您可以创建User对象(通过服务或工厂)。
  2. 您将该对象注入任何想要与之交互的控制器。
  3. $watch该对象(如果您认为该功能是User实体的核心部分,则来自服务内部)并在检测到更改时更新后端(可选择使用去抖动) )。
  4. 对于{{1}来自服务内部的内容,您可以注入$watch服务。
  5. 请记住(在真实应用中)您需要考虑错误和角落案例。例如。如果用户在去抖期间之前离开页面会发生什么情况等。
  6. <子> 以下是一个天真的POC实现。在现实世界中,您可能希望使用模块(如Mikke所提及的模块)并在其周围包装您的服务,以便在与RESTful数据源交互时节省大量样板代码。


    演示服务可能如下所示:

    $rootScope

    另请参阅此 short demo

答案 2 :(得分:0)

在控制器之间共享数据时,服务是可行的方法。你似乎已经对此有了一个好主意。

为了在每次操作后保存用户,我不明白问题所在。创建一个修改用户方法,然后可以进行对象比较。如果存在差异,则将PUT请求发送到api。

答案 3 :(得分:0)

我建议您始终使用服务/工厂在控制器(以及指令)之间共享数据,并在两侧进行注入。

之后,只需使用您的承诺解析功能来更新服务价值。

app.factory('SharedService', function() {
  return {
    sharedObject: {
      value: '',
      value2: ''
    }
  };
});

app.controller('FirstCtrl', function($scope, SharedService) {
  $scope.model = SharedService.sharedObject;
});

app.directive('myDirective',['SharedService', function(SharedService){
  return{
    restrict: 'E',
    link: function(scope){
      scope.model = SharedService.sharedObject;
    },
    template: '<div><input type="text" ng-model="model.value"/></div>'
  }
}]);

这是一个显示如何完成的傻瓜: http://plnkr.co/edit/Q1VdKJP2tpvqqJL1LF6m