$http之后更新多个控制器中的作用域
update scopes in multiple controllers after $http
我正在努力想办法做到这一点。希望有人能帮忙:)
-
我的Angular应用程序中有多个控制器。类似标题Ctrl和设置Ctrl
-
我有一个服务,它包含这样一个变量:
var myVar = {title: 'test', settings: {color: 'black', font: 'verdana'}};
-
我正在进行$http.get请求以更新";myVar";变量。
问题是,在http请求完成后,如何更新titleCtrl中的$scope.title和SettingsCtrl中的$scope.settings?我知道如何在单个控制器中执行此操作,但如何在多个控制器中更新$scope?
在服务中对该变量使用监视。更新后,请更新控制器范围中的值。这里有一个例子:
在控制器中,您可以在YourService
上观察一个var myVar
,当它发生变化时,用它变为的值更新一个名为myVarInController
的变量。
$scope.$watch(
// This function returns the value being watched.
function() {
return YourService.myVar;
},
// This is the change listener, called when the value returned above changes
function(newValue, oldValue) {
if ( newValue !== oldValue ) {
$scope.myVarInController = newValue;
}
}
);
在您的服务中,当您从服务器获取数据时,会创建一个对象,并将其复制到该对象,这样您的所有控制器都可以引用该对象。请看这里http://plnkr.co/edit/j25GJLTHlzTEVS8HNqcA?p=preview
JS:
var app = angular.module('plunker', []);
app.service('dataSer', function($http) {
var obj = {};
getData = function() {
$http.get("test.json").then(function(response) {
angular.copy(response.data, obj);
});
}
return {
obj: obj,
getData: getData
};
});
app.controller('MainCtrl', function($scope, dataSer) {
$scope.data = dataSer;
$scope.get = function() {
$scope.data.getData()
}
});
app.controller('SecondCtrl', function($scope, dataSer) {
$scope.data = dataSer;
});
HTML:
<div ng-controller="MainCtrl">
<button ng-click="get()">get data</button>
<p>Fist Controller:
<br/>{{ data.obj.title}}</p>
</div>
<div ng-controller="SecondCtrl">
<p>Second Controller:
<br/>{{data.obj.settings}}</p>
</div>
使用工厂和服务将值传递给两个控制器。这是传递值的唯一方法
angular.module('mulipleCtrlApp', [])
.service('shareService', function () {
return {
title: 'test',
settings: {
color: 'black',
font: 'verdana'
}
};
})
.controller('titleCtrl', function ($scope, shareService) {
$scope.myVar = shareService;
$scope.testchange = function () {
$scope.myVar.title = 'Completed test';
};
})
.controller('settingCtrl', function ($scope, shareService) {
$scope.myVar = shareService;
});
蛋头链接
Jsfidler链接示例
- 使您的服务返回承诺对象
- 然后,在控制器中,您可以定义一个成功回调以在中获取标题,并在中设置一旦承诺得到解决,另一个控制器
代码使用承诺
在您的服务类别中:
var factory = {};
var factory.fetchData = function () {
return $http({method: 'GET', url: '/someUrl'});
}
return factory;
在控制器1中:
$scope.getData = function(){
factory.fetchData().success(response){
$scope.title = response.title;
}
}
类似地,您可以更新控制器2,以设置设置数据。
在我看来,我找到了一个更好、更易于维护的解决方案。只需执行以下操作即可实现一个(或多个)控制器与服务之间的双向数据绑定:
假设您获取(即$http)并将数据存储在变量serviceData中的服务(serviceName)中。
在您的控制器中引用这样的服务来实现数据绑定:
$scope.data = serviceName
在您的视图/html中,绑定到如下数据属性:
<input ng-model="data.serviceData.title">
就是这样!:)当serviceData变量更新视图/范围时,也会更新。这将适用于多个控制器。
- 正在$rootScope上达到控制器作用域$在内部控制器上
- 从指令链接函数监视控制器作用域
- 控制器作用域变量在刷新之前未加载
- AngularJS:如何在指令范围的对象发生变化时更新与控制器作用域相关联的控制器作用域
- ng-click 指令不调用控制器作用域中定义的函数
- 如何从2级指令访问控制器作用域
- 角度指令控制器作用域继承
- 触发指令AngularJs的控制器作用域
- Angularjs-在路由更改时刷新控制器作用域
- 访问父指令's子指令中的控制器作用域变量
- 将Angular Service对象绑定到控制器作用域并更新
- UI引导日期选择器不调用内联控制器作用域上的函数
- 将变量从控制器作用域传递到指令
- 工厂中与控制器作用域绑定的已修改数据不会更新
- 带有双向绑定的孤立作用域指令不能反映控制器作用域的变化
- 如何在angular 1.4.5+中操纵指令中的控制器作用域
- AngularJS:在两个具有隔离作用域的指令之间共享一个控制器作用域
- 如何将控制器作用域变量传递给angular.元素在头部元素中追加子元素时
- AngularJS+Jasmine -在指令中写入一个控制器作用域
- 如何从嵌入式D3脚本中访问Angular控制器作用域