AngularJS使用服务在控制器之间共享数据并监视更新
简单的任务在这里,但不确定的错误 我的服务:AngularJS使用服务在控制器之间共享数据并监视更新,angularjs,Angularjs,简单的任务在这里,但不确定的错误 我的服务: app.factory('Progress', function () { var data = { progressPercentageLoaded: 0 }; return { getProgress: function () { return data.progressPercentageLoaded; }, setProgres
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
值进行更新,但它不更新
提前感谢您的指导
EDIT:我甚至将第三个watch
参数添加为true
,但这也没有帮助
编辑2:就我所知,上面的代码实际上是有效的,我相信是其他原因造成了问题,因为当我根据答案编辑代码后将代码还原到上面时,它突然正常工作了。对此很抱歉。使用$rootScope。$broadcast更适合此功能 应用程序工厂('Progress',函数($rootScope){ 在第二个控制器中,而不是使用手表 差不多
$rootScope.$on('Event', function(){
//your logic here
})
您正在丢失引用,因为您正在查看每次更新的
Int
值,因此您正在更改引用。您必须查看整个对象progressPercentageLoaded
您必须将true作为
$watch
函数的最后一个参数传递,以便相等检查是angular.equals
。否则,只检查引用相等性。我不是100%确定,但angular可能不知道文件上载事件。请尝试调用$apply
:
$scope.$apply(function() {
Progress.setProgress($scope.progressPercentageLoaded.progress);
});
如果可能的话,我更愿意坚持使用
watch
。很抱歉,我理解你说的话,但不知道在代码中进行此更改的位置…我只看Progress.getProgress();
如果我只是在那里返回对象而不是data.progressPercentageLoaded;
我仍然有同样的问题!我有true
作为最后一个参数,它仍然不起作用。但是int值不是每次都在同一个对象上更新吗?并且是从同一个对象返回的吗?我不认为引用是问题em.尝试将服务附加到控制器的作用域$scope.progress=progress.getProgress();
,然后观察$scope.progress
,如果我console.log()
手表上的新旧值,我总是只得到0,0
一次,它就再也不会更新了。我本来以为是这样的,以前试过,现在也试过,但没有解决问题:(您在控制台中看到任何错误吗?这些控制器是否相互继承?我创建了一个简单的示例,其中有两个控制器,并且我看到监视程序正在执行。但是,我没有上传文件,而是每隔2秒调用setProgress
:var p=0;setInterval(function(){$scope.$apply(function(){Progress.setProgress(++p);});}, 2000)
这对你有用吗?@FrankModica上面的代码确实有效,我不知道为什么以前不起作用,但我只是将它恢复到上面,它工作正常。我看到上传事件被记录下来,但上传百分比没有变化,可能上传太大,以至于在上传更多内容时它也没有变化?我很抱歉不确定,但我刚才尝试了一些小文件,视图得到了适当的更新,没有对上述代码进行任何更改,很抱歉浪费了您的时间!:(没问题,很高兴它能工作:)
$scope.$apply(function() {
Progress.setProgress($scope.progressPercentageLoaded.progress);
});