gpt4 book ai didi

javascript - 无法在 setInterval 操作上绑定(bind)值

转载 作者:行者123 更新时间:2023-11-28 14:56:17 25 4
gpt4 key购买 nike

我正在尝试创建一个包含 2 个 Controller 和 2 个服务的简单示例,其中每 3 秒调用一次服务之一。

Controller 1 调用服务,该服务更改 Controller 2 中使用的值。我通过另一个服务传递该值,但只有在按下示例的“停止”按钮(如下所示)后,该值才会在我的 html 页面上更新。

我可以在每次投票时更新页面值(value)吗?

<html ng-app="myApp">
<head>
<title>MyApp</title>
<script src="angular.js"></script>
<script>
var app = angular.module('myApp',[]);


app.service('SimpleService', function() {

var _value = 0;

var setValue = function(v) {
_value = v;
}

var getValue = function(){
return _value;
}

return {
setValue: setValue,
getValue: getValue
};
})

app.service('PollService', function(SimpleService) {

var poll = undefined;


var startPolling = function(){

poll = setInterval(function(){
console.info('poll...');
console.info(SimpleService.getValue());
SimpleService.setValue(SimpleService.getValue()+1);

}, 3000);

}

var stopPolling = function(){
clearInterval(poll);
}


return {
startPolling: startPolling,
stopPolling: stopPolling
};
})


app.controller('Controller1',function($scope, PollService){
var poll = undefined;


$scope.startPolling = function(){
PollService.startPolling();
}

$scope.stopPolling = function(){
console.info('stop');
PollService.stopPolling();
}

});


app.controller('Controller2', function($scope, SimpleService){
$scope.newVal = function(){
return SimpleService.getValue();
}
});
</script>

</head>

<body>
<div ng-controller="Controller1">
<button ng-click="startPolling()">Start</button>
<button ng-click="stopPolling()">Stop</button>
<br/>
<br/>

</div>
<div ng-controller="Controller2">
<h5>New value: {{newVal()}}</h5>
</div>

</body>

问候。

最佳答案

每次在 SimpleService 中调用 setter 时,都需要调用摘要循环。除非新的摘要周期开始,否则 View 绑定(bind)不会更新。这是工作代码片段。

    app.service('SimpleService', function($rootScope) {

var _value = 0;

var setValue = function(v) {
_value = v;
$rootScope.$apply(); //added this here
}

var getValue = function(){
return _value;
}

return {
setValue: setValue,
getValue: getValue
};
})

您需要执行scope.apply()。 $apply 评估模板中的任何表达式并开始新的摘要周期。在 $digest 阶段,作用域检查所有 $watch 表达式并将它们与之前的值进行比较。您可以查看有关它的文档 here .

我在您的代码中注意到的一些其他问题:

app.controller('Controller2', function($scope, SimpleService2){
$scope.newVal = function(){
return SimpleService.getValue();
}
});

此处,将名称更正为 SimpleService。

没有 stopPropagation 的方法。我在 PollService 中按如下方式添加了它以使您的代码正常工作:

var stopPolling = function(){
clearInterval(poll);
}

关于javascript - 无法在 setInterval 操作上绑定(bind)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42703709/

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