AngularJS -如何在多个控制器中共享监视对象
AngularJS - How to share watched objects in several controllers?
我当前的控制器充满了隐藏提交按钮的逻辑,并在后端获取数据后显示成功消息:
angular.module('testApp').controller('TestCtrl', ['$scope', 'testService',
function ($scope, testService) {
$scope.loading = false;
$scope.updated = false;
$scope.error = false;
$scope.submit = function() {
if(!$scope.form.$valid) {
return;
}
$scope.loading = true;
testService.doBackendUpdate({some:'data'})
.success(function() {
$scope.error = $scope.loading = false;
$scope.updated = true;
})
.error(function(error) {
$scope.updated = $scope.loading = false;
$scope.error = true;
});
};
}]);
html: 和
<alert type="'success'" close="updated = false" ng-show="updated">Data Updated!</alert>
<button ng-hide="loading">update</button>
我想要的是某种对象,而不是那些变量,并重用它在其他控制器上:
angular.module('testApp').controller('TestCtrl', ['$scope', 'testService',
function ($scope, testService) {
$scope.status = new ActionStatus();
$scope.submit = function() {
if(!$scope.form.$valid) {
return;
}
$scope.status.loading();
testService.doBackendUpdate({some:'data'})
.success(function() {
$scope.status.succes();
})
.error(function(error) {
$scope.status.error();
});
};
}]);
html: 和
<alert type="'success'" close="updated = false" ng-show="status.isUpdated">Data Updated!</alert>
<button ng-hide="statuss.isLoading">update</button>
但是我怎么才能做到呢?AngularJS的watch在观察变量时失去了上下文,所以它不能简单地通过原型创建一个ActionStatus对象。
任何想法?
要在多个控制器之间共享对象,你应该创建一个服务。
的例子:
// Custom object
function ActionStatus() {
this.isLoading = false;
this.updated = false;
this.error = false;
this.loading = function() {};
}
angular.module('testApp').service('actionStatus', [ActionStatus]);
// Inject object factory dependency to your controller.
angular.module('testApp').controller('TestCtrl', ['$scope', 'testService', 'actionStatus',
function ($scope, testService, actionStatus ) {
$scope.status = actionStatus;
}]);
这里的问题是服务是单例的,并且是用new
关键字实例化的。
app.factory('actionStatus', [function() {
// Define constructor
function ActionStatus() {
this.isLoading = false;
this.updated = false;
this.error = false;
this.loading = function() {};
this.stopLoading = function() {
this.isLoading = false;
};
}
// Return constructor to handle the instantiation yourself.
return ActionStatus;
}]);
我为你创建了一个关于plnkr的工作示例:http://plnkr.co/edit/Wd4kmg?p=preview
更多信息:
http://code.angularjs.org/1.2.14/docs/guide/providers我可以从三个方面考虑:
- 放入
$rootScope
- 将其置于服务/工厂中,并使用消息系统(
$broadcast
,$emit
,$on
)相互通信。 -
与第二个选项类似,只需观察
objectEquality
设置为true的服务,如下所示:$watch(WhateverService.get(), functiondoTheJob(){...}, true)
相关文章:
- 使用服务(AngularJS)在控制器之间共享数据
- 通过共享服务在两个不同ng应用程序中的控制器之间共享数据
- 共享变量和多个控制器AngularJS
- 使用Angularjs在两个不同页面的控制器之间共享数据
- 在Angular Bootstrap Modal和父控制器之间共享作用域
- 2ng控制器,并且需要在控制器之间共享数据
- 在控制器angular js之间共享数据
- AngularJS:如何与其他控制器共享作用域函数和变量
- 如何将json文件中的数据提取到对象数组中,并在两个控制器之间共享
- 在angularJS中使用模态窗口时,在控制器之间共享对象数组
- 在角度上不同控制器之间共享状态
- 如何在控制器之间共享来自休息服务的数据
- AngularJS控制器之间共享代码/方法/功能
- 如何在Angular JS中的控制器之间共享搜索功能
- 与其他控制器共享选定的选择
- 如何在angular js中跨控制器共享函数
- Angular JS中包含多个控制器共享的视图逻辑的公共位置
- Angularjs:两个视图,同一个控制器——共享作用域
- 通过状态控制器共享资源对象
- $http与其他控制器共享数据,并模块化$http调用