Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS使用服务在控制器之间共享数据并监视更新_Angularjs - Fatal编程技术网

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);
});