Angular - 模板未使用从两个不同范围绑定到同一服务的数据刷新
Angular - Template not refreshed with data bound from two different scopes to the same service
我将两个不同范围的数据绑定到同一个公共服务数据上。当我通过controller 1更新数据时,controller 2中的数据并没有在模板中刷新。
显示问题的示例:
<body ng-app="demoShareBindApp">
<div ng-controller="FirstCtrl as first">
Set share data to : <a href ng-click="setShareDataTo('Me')">"Me"</a>
- <a href ng-click="setShareDataTo('Myself')">"Myself"</a>
- <a href ng-click="setShareDataTo('I')">"and I"</a>
</div>
<div ng-controller="SecondCtrl as second">
Text entered : {{sShareData}}
<br>
<br><a href ng-click="revealShareData()">Reveal data</a>
</div>
<script src="bower_components/angular/angular.js"></script>
<script>
angular
.module('demoShareBindApp', [])
.service('myService', function () {
return {
shareData: null
}
})
.controller('FirstCtrl', ['$scope', 'myService', function ($scope, myService) {
$scope.setShareDataTo = function(content) {
myService.shareData = content;
};
}])
.controller('SecondCtrl', ['$scope', 'myService', function ($scope, myService) {
$scope.sShareData = myService.shareData;
$scope.revealShareData = function() {
console.log(myService.shareData);
}
}]);
</script>
</body>
Text entered : {{sShareData}}
永远不会更新,而单击 "Reveal data" 会在控制台中显示正确的共享数据。
我在其他 SO post 中找不到关于这个特定主题的任何线索。我想这可能是“$watch/$digest”的问题,但我不知道这里到底发生了什么。
欢迎详细解释!
您正在通过服务共享数据。当第一个控制器下的数据发生变化时,你将这个更新的数据设置为服务,但是第二个控制器不知道服务引用的共享数据发生了变化,所以我们需要通知第二个控制器数据发生变化或者我们可以通过[=共享数据14=]
我创建了一个fiddle,检查一下
https://jsbin.com/midebu/edit?html,js,output
第一种方法。使用服务
$scope.setShareDataTo = function(content) {
myService.shareData = content;
$rootScope.$broadcast('datacChanged');
};
在第二个控制器中
$rootScope.$on('dataChanged', function(){
// get updated data
$scope.sShareData = myService.shareData;
})
另一种方式是,我们不需要使用服务,我们可以简单地使用事件传递共享数据
$scope.setShareDataTo = function(content) {
$rootScope.$broadcast('datacChanged', content);
};
在第二个控制器中
$rootScope.$on('dataChanged', function(event, data){
// get updated data
$scope.shareData = data;
})
我将两个不同范围的数据绑定到同一个公共服务数据上。当我通过controller 1更新数据时,controller 2中的数据并没有在模板中刷新。
显示问题的示例:
<body ng-app="demoShareBindApp">
<div ng-controller="FirstCtrl as first">
Set share data to : <a href ng-click="setShareDataTo('Me')">"Me"</a>
- <a href ng-click="setShareDataTo('Myself')">"Myself"</a>
- <a href ng-click="setShareDataTo('I')">"and I"</a>
</div>
<div ng-controller="SecondCtrl as second">
Text entered : {{sShareData}}
<br>
<br><a href ng-click="revealShareData()">Reveal data</a>
</div>
<script src="bower_components/angular/angular.js"></script>
<script>
angular
.module('demoShareBindApp', [])
.service('myService', function () {
return {
shareData: null
}
})
.controller('FirstCtrl', ['$scope', 'myService', function ($scope, myService) {
$scope.setShareDataTo = function(content) {
myService.shareData = content;
};
}])
.controller('SecondCtrl', ['$scope', 'myService', function ($scope, myService) {
$scope.sShareData = myService.shareData;
$scope.revealShareData = function() {
console.log(myService.shareData);
}
}]);
</script>
</body>
Text entered : {{sShareData}}
永远不会更新,而单击 "Reveal data" 会在控制台中显示正确的共享数据。
我在其他 SO post 中找不到关于这个特定主题的任何线索。我想这可能是“$watch/$digest”的问题,但我不知道这里到底发生了什么。
欢迎详细解释!
您正在通过服务共享数据。当第一个控制器下的数据发生变化时,你将这个更新的数据设置为服务,但是第二个控制器不知道服务引用的共享数据发生了变化,所以我们需要通知第二个控制器数据发生变化或者我们可以通过[=共享数据14=]
我创建了一个fiddle,检查一下
https://jsbin.com/midebu/edit?html,js,output
第一种方法。使用服务
$scope.setShareDataTo = function(content) {
myService.shareData = content;
$rootScope.$broadcast('datacChanged');
};
在第二个控制器中
$rootScope.$on('dataChanged', function(){
// get updated data
$scope.sShareData = myService.shareData;
})
另一种方式是,我们不需要使用服务,我们可以简单地使用事件传递共享数据
$scope.setShareDataTo = function(content) {
$rootScope.$broadcast('datacChanged', content);
};
在第二个控制器中
$rootScope.$on('dataChanged', function(event, data){
// get updated data
$scope.shareData = data;
})