如何在数据更改后重新实例化AngularJS控制器?

问题描述:

我看过了,并且认为这很简单,但只是无法弄清楚API文档。如何在数据更改后重新实例化AngularJS控制器?

假设我有一个控制器首先调用时提取数据(我离开了一吨,当然):

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 
    }); 
    }; 
}); 

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

谢谢!

好的,虽然我确信有更好的答案,我有一个给我。本质上,我正在采取控制器的重要部分,并将它们置于成功回调中。为了防止看起来很乱,我已经将控制器中需要更新的所有部分包装在命名函数中。

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的方式来再次调用它。

您不需要刷新。只需更改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); 

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

+0

这很混乱,实际上不适合我。我的错,这个例子太简单了。事实是,我有一个$ scope.allData对象(再次简化)是多个服务(Think $ q.all([service1,service2,service3,...])的组合结果。then(function([result1 ,result2,...]){很多操纵});)。一个数据集中的更改要求重新计算组合对象。我甚至有多个对象组合了一些数据源,但不是全部。 – MyTimeFinder 2013-04-27 22:09:11

+0

你能解释一下你的意思吗?“使用服务......你看”?有没有办法看Data.save()来查看它是否被调用?即使我这样做,我还不得不告诉它做些什么?如何在不调用某些函数的情况下更新所有其他范围对象? – MyTimeFinder 2013-04-27 22:11:23

+0

要明确一点,实际上我有多个作用域对象,当用户更新一个数据源时需要更新这些对象。在将数据分配给作用域对象之前,对数据进行后检索处理并不轻松,并涉及多个承诺对象。看来我最终会重新创建Data.save()。success()回调中的大部分控制器函数。正如你所说,这是非常混乱。 - 谢谢。 – MyTimeFinder 2013-04-27 22:15:27