gpt4 book ai didi

AngularJS 从 Controller 触发并观察服务中的对象值变化

转载 作者:行者123 更新时间:2023-12-03 07:54:59 25 4
gpt4 key购买 nike

我正在尝试从 Controller 观察服务的变化。我在stackoverflow上尝试了基于许多qns的各种事情,但我一直无法使其工作。

html:

<div ng-app="myApp">
<div ng-controller="MyCtrl">
<div ng-click="setFTag()">Click Me</div>
</div>
</div>

javascript:
var myApp = angular.module('myApp',[]);

myApp.service('myService', function() {
this.tags = {
a: true,
b: true
};


this.setFalseTag = function() {
alert("Within myService->setFalseTag");
this.tags.a = false;
this.tags.b = false;

//how do I get the watch in MyCtrl to be triggered?
};
});


myApp.controller('MyCtrl', function($scope, myService) {

$scope.setFTag = function() {
alert("Within MyCtrl->setFTag");
myService.setFalseTag();
};

$scope.$watch(myService.tags, function(newVal, oldVal) {
alert("Inside watch");
console.log(newVal);
console.log(oldVal);
}, true);

});

如何让 watch 在 Controller 中触发?

jsfiddle

最佳答案

试着写$watch通过这种方式:

myApp.controller('MyCtrl', function($scope, myService) {


$scope.setFTag = function() {
myService.setFalseTag();
};

$scope.$watch(function () {
return myService.tags;
},
function(newVal, oldVal) {
/*...*/
}, true);

});

演示 Fiddle

[编辑]

有时这种方式不起作用,特别是如果服务已从 3d 方更新。

为了使它起作用,我们必须帮助调整消化循环的 Angular 。

这是一个例子:

当我们想要更新时在服务方面 tags值写如下:
if($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest'){
$rootScope.$apply(function() {
self.tags = true;
});
}
else {
self.tags = true;
}

关于AngularJS 从 Controller 触发并观察服务中的对象值变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20667474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com