这里的任务很简单,但不确定错误。
我的服务:
app.factory('Progress', function () {
var data = {
progressPercentageLoaded: 0
};
return {
getProgress: function () {
return data.progressPercentageLoaded;
},
setProgress: function (progress) {
data.progressPercentageLoaded = progress;
}
};
});
我有一个正在上传文件的控制器,这个控制器设置进度值。
//in my controller
$scope.progressPercentageLoaded = {progress:0};
//a few lines down
function (evt) {
console.log(evt);
$scope.progressPercentageLoaded.progress = evt.loaded;
Progress.setProgress($scope.progressPercentageLoaded.progress);
我的第二个控制器应该只是监视服务的更改并更新视图,但即使我确认上传正在进行并且evt.loaded
正在更改,它仍停留在零。
$scope.progress = 0;
$scope.$watch(function () { return Progress.getProgress(); }, function (newValue, oldValue) {
if (newValue !== oldValue) {
$scope.progress = Math.min(100, parseInt(100 * newValue / $scope.size));
if($scope.progress == 100)
{
$scope.progressModalInstance.close();
window.location.reload();
}
}
});
也就是说,第二个控制器中的$scope.progress
应使用第一个控制器中的 evt.loaded
值进行更新,但事实并非如此。
提前感谢您的任何指导。
编辑:我什至添加了第三个watch
参数作为true
但这也没有帮助。
2 :据我所知,上面的代码实际上可以正常工作,我相信还有其他原因导致了问题,因为当我在编辑代码后由于答案而将代码恢复到上面时,它突然像它应该的那样工作。对此感到抱歉。
使用 $rootScope.$broadcast 会更好地解决这个问题
app.factory('Progress', function ($rootScope( {
var data = {
progressPercentageLoaded: 0
};
return {
getProgress: function () {
$rootScope.$broadcast('Event');
return data.progressPercentageLoaded;
},
setProgress: function (progress) {
data.progressPercentageLoaded = progress;
}
};
});
在第二个控制器中,而不是使用手表类似的东西
$rootScope.$on('Event', function(){
//your logic here
})
您将丢失引用,因为您正在监视每次更新的Int
值,因此您正在更改引用。你必须progressPercentageLoaded
观看整个对象。
您必须传递 true 作为 $watch
函数的最后一个参数,以便angular.equals
相等性检查。否则,仅检查引用相等性。
我不是 100% 确定,但 Angular 可能不知道文件上传事件。尝试拨打$apply
:
$scope.$apply(function() {
Progress.setProgress($scope.progressPercentageLoaded.progress);
});