如何在数据更改后重新实例化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);
但是:你不应该这样做的方式。这看起来很乱。使用您观看的服务或事件来等待服务返回的更改。
这很混乱,实际上不适合我。我的错,这个例子太简单了。事实是,我有一个$ scope.allData对象(再次简化)是多个服务(Think $ q.all([service1,service2,service3,...])的组合结果。then(function([result1 ,result2,...]){很多操纵});)。一个数据集中的更改要求重新计算组合对象。我甚至有多个对象组合了一些数据源,但不是全部。 – MyTimeFinder 2013-04-27 22:09:11
你能解释一下你的意思吗?“使用服务......你看”?有没有办法看Data.save()来查看它是否被调用?即使我这样做,我还不得不告诉它做些什么?如何在不调用某些函数的情况下更新所有其他范围对象? – MyTimeFinder 2013-04-27 22:11:23
要明确一点,实际上我有多个作用域对象,当用户更新一个数据源时需要更新这些对象。在将数据分配给作用域对象之前,对数据进行后检索处理并不轻松,并涉及多个承诺对象。看来我最终会重新创建Data.save()。success()回调中的大部分控制器函数。正如你所说,这是非常混乱。 - 谢谢。 – MyTimeFinder 2013-04-27 22:15:27