1

我看过,并假设这很简单,但只是无法弄清楚 API 文档。

假设我有一个控制器,它在第一次调用时提取数据(当然,我遗漏了很多):

myCtrl = function ($scope, Data) {
  $scope.data = [];

  data_promise = Data.getData(); //a $http service
  data_promise.success(function (data) {
    $scope.data = data;
  });
}

这很好用,当页面加载时,我会根据需要完全填充 $scope.data。然而,当然,用户可能希望更新数据。假设当服务器单击表单上的“保存”按钮时调用一个简单的服务“Data.save()”:

myApp.factory('Data', function ($http) {
  save: function (data) {
    $http({
      method: 'POST',
      url: 'someURL',
      data: data,
    }).success(function(){
      //something here that might trigger the controller to refresh
    });
  };
});

我会在可能重新实例化控制器的成功回调中添加什么,以便它拥有来自服务器的最新数据?目前我必须刷新页面以获取更新的数据。我现在并不担心通过兑现结果和更改来最小化服务器调用。我只需要先让它工作。

谢谢!

4

2 回答 2

0

您无需刷新。只需更改 ControllerScope 中的更新数据。

这应该有效。

myApp.factory('Data', function ($http) {
  save: function (data, $scope) {
    $http({
      method: 'POST',
      url: 'someURL',
      data: data,
    }).success(function(){
      $scope.data = newData;
      //something here that might trigger the controller to refresh
    });
  };
});

// in your controller
Data.save(data, $scope);

但是:你不应该这样做。这看起来很乱。使用您观看的服务或事件来等待从服务返回的更改。

于 2013-04-27T19:54:42.437 回答
0

好的,虽然我确信有一个更好的答案,但我有一个适合我的答案。本质上,我将控制器的重要部分放在成功回调中。为了不让它看起来凌乱,我将控制器中需要更新的所有部分都包装在一个命名函数中。

myCtrl = function ($scope, Data, $q) {

// Binding the Data
  var updateAll;
  updateAll = function () {

    $scope.data1 = [];
    $scope.data2 = [];
    $scope.data3 = [];
    $scope.data4 = [];

    service_promise1 = Data.getData1(); //a $http service
    service_promise2 = Data.getData2();
    service_promise3 = Data.getData3();
    service_promise4 = Data.getData4();

    $q.all([service_promise1,service_promise2,service_promise3,service_promise4])
    .then(function([service1,service2,service3,service]){
      $scope.data1 = service1 + service2 //I know this isn't valid Javascript
      // just for illustration purposes
      $scope.data2 = service2 - service1 + service 3
      //etc...
    });
  };
  updateAll();


//Form Section  
$("#myForm').dialog({
  buttons: {
     Save: function () {
       Data.save(data).success(function(){
          updateAll();
        });
      }
    }
  });
}

打破这一点,我已经将依赖于服务的范围对象的所有分配包装到 updateAll 函数中,并在 myCtrl 的实例化时调用它。在更新数据的形式中,我在 Data.save() 函数成功时调用 updateAll() 函数。

不完全是脑部手术,我承认,但我对 $scope.$apply() 感到困惑,并考虑只调用 myCtrl()。不知何故,这似乎是“Angular”的方式,但都没有奏效。我猜控制器函数只在页面刷新时运行一次,并且没有 Angular 方法可以再次调用它。

于 2013-04-27T23:08:24.183 回答