Angular 服务范围变化不影响模板
Angular scope changes in service not affecting template
我设置了一个可以在模板上显示状态消息的服务。
.service('displayStatus', function ()
{
var statusTime = 5000;
var self = this;
this.show = function ($scope, type, msg)
{
$scope.status = {
type: type,
msg: msg
}
self.timer = setTimeout(function ()
{
self.hide($scope);
}, statusTime);
}
this.hide = function ($scope)
{
$scope.status = {
type: null,
msg: null
}
console.log('hid it', $scope);
}
})
每当我想要显示错误时,我只需调用 displayStatus.show($scope, 'error', 'Uh oh! An error!')
。是 setTimeout 给我带来了问题。虽然模板将根据我在 "this.show" 中所做的更改进行更新,但在等待 5 秒并尝试隐藏它后,更改不适用,即使 console.log 显示我正在更改 $scope .
为什么我的更改没有显示?
您需要将事件处理程序的主体包装在 $scope.$apply
, or better yet, use the $timeout
服务中以执行超时,它会为您完成此操作。调用您的函数后,$apply
触发一个 $digest
循环,这就是 angular 检测模型变化的方式。
.service('displayStatus', function ($timeout)
{
var statusTime = 5000;
var self = this;
this.show = function ($scope, type, msg)
{
$scope.status = {
type: type,
msg: msg
}
self.timer = $timeout(function ()
{
self.hide($scope);
}, statusTime);
}
this.hide = function ($scope)
{
$scope.status = {
type: null,
msg: null
}
console.log('hid it', $scope);
}
})
我设置了一个可以在模板上显示状态消息的服务。
.service('displayStatus', function ()
{
var statusTime = 5000;
var self = this;
this.show = function ($scope, type, msg)
{
$scope.status = {
type: type,
msg: msg
}
self.timer = setTimeout(function ()
{
self.hide($scope);
}, statusTime);
}
this.hide = function ($scope)
{
$scope.status = {
type: null,
msg: null
}
console.log('hid it', $scope);
}
})
每当我想要显示错误时,我只需调用 displayStatus.show($scope, 'error', 'Uh oh! An error!')
。是 setTimeout 给我带来了问题。虽然模板将根据我在 "this.show" 中所做的更改进行更新,但在等待 5 秒并尝试隐藏它后,更改不适用,即使 console.log 显示我正在更改 $scope .
为什么我的更改没有显示?
您需要将事件处理程序的主体包装在 $scope.$apply
, or better yet, use the $timeout
服务中以执行超时,它会为您完成此操作。调用您的函数后,$apply
触发一个 $digest
循环,这就是 angular 检测模型变化的方式。
.service('displayStatus', function ($timeout)
{
var statusTime = 5000;
var self = this;
this.show = function ($scope, type, msg)
{
$scope.status = {
type: type,
msg: msg
}
self.timer = $timeout(function ()
{
self.hide($scope);
}, statusTime);
}
this.hide = function ($scope)
{
$scope.status = {
type: null,
msg: null
}
console.log('hid it', $scope);
}
})