2014-09-04 39 views
1

我正在使用jsonn对象来加载对象之间的数据。目前使用工厂来返回对象并将其绑定在控制器之间。现在我做像这样的副本:

var LevelsHere = $http.get("my.json") 
      .success(function(data){ 
      var dataCopy = angular.copy(data); 
      return dataCopy; 
      }); 
return { 
    all: function() { 
     return LevelsHere; 
    } 
    }; 

这工作得很好,但我有一个按钮,我想调用此函数并刷新它,所以它从my.json得到一个干净的副本(所以任何变化被恢复)。

只是为了澄清,在每个控制器我把它变成一个范围控制器内像这样

UserService.all().then(function(data){ 
      $scope.storeHere= data.data;  
     }); 

我想或许真的像$ rootscope可能会去,因为我之间共享的方式控制器。所以 - 在控制器之间共享root作用域(这是json的一个副本)。然后,当我按下我的刷新按钮时,它会刷新$ rootscope并带有my.json的新副本,以便更改恢复。

也许我可以使用我现在正在尝试的方法?我试着让刷新按钮再次调用$ get,但它并没有绑定到两个地方,所以它只能在一个控制器中刷新。

要快速审查 - 我有json我引入和使用2控制器与工厂调用它。我希望能够刷新,以便在两个地方刷新。

这是我在刷新尝试:

$scope.cancelProcedure = function() { 
     //refresh data 
     UserService.all().then(function(data){ 
      $scope.levels = data.data; 

    }; 

的问题,这是它调用当前数据,并且不会有新的呼叫刷新。我不知道如何在两个地方刷新它。谢谢!!

+0

听起来很容易,但有一个问题:两个控制器是否真的需要数据的独立副本或它的相同副本?你正在对数据进行角度复制,这就是为什么我要求...... – mbernath 2014-09-04 21:24:50

+0

不,他们根本不会。 – ajmajmajma 2014-09-04 21:58:56

回答

1

给你一个答案,我假设如下:

  • 有你想要得到my.json和更新不时一个资源。
  • 你想从两个(或更多)控制器访问和更新数据
  • 你不想污染您$rootScope

在这种情况下,理想的解决办法是将存储方法来获取/更新工厂中的数据以及当前数据。在每个需要这些数据的控制器中,只需将工厂注入并将其分配给该控制器的$scope即可。

这里有一个例子:

angular.factory('dataFactory', ['$http', function ($http) { 

    var dataFactory={}; 

    dataFactory.currentData = null; 

    dataFactory.update = function() { 
    return $http.get("my.json") 
    .success(function(data){ 
     dataFactory.currentData = data; 
     return data; 
    }); 
    }; 

    return dataFactory; 

}]); 

angular.controller('firstCtrl', ['$scope', 'dataFactory', function ($scope, dataFactory) { 
    $scope.data = dataFactory; 
}]); 

angular.controller('secondCtrl', ['$scope', 'dataFactory', function ($scope, dataFactory) { 
    $scope.data = dataFactory; 
}]); 

在HTML然后你可以使用例如ng-bind="data.currentData"ng-click="data.update()"。进一步的想法:如果你不想把工厂放在你的控制器$scope中,你甚至可以考虑进一步分解你的逻辑并创建一个或两个基于该工厂的指令。但是,如果这样做有道理并不容易告诉给定的信息。

+0

如果我想要数据最初填充,我可以只将数据工厂设置为最初运行的$ http.get?那么我可以让数据工厂调用刷新。想法?我要问的原因是我必须做一个UserService.all()。然后(函数(数据){$ scope.listTable = data.data;});在控制器中确保ajax运行初始化。想法?谢谢! – ajmajmajma 2014-09-05 13:23:03

+0

通常,您可以通过'app.run'函数执行初始填充,也可以使用ngRouter或UI-Router的路由解析。使用后者esp。如果你只需要它初始化某些路线。首先,第一种解决方案可能更容易实施。请参阅[Angular Documentation](https://docs.angularjs.org/guide/module)中的“运行块” – mbernath 2014-09-05 15:11:03

+0

因此,我可以在.run中运行get,然后将它传递到工厂? – ajmajmajma 2014-09-05 15:20:42