首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS:未定义$rootscope的全局函数中的错误,未定义$scope

AngularJS:未定义$rootscope的全局函数中的错误,未定义$scope
EN

Stack Overflow用户
提问于 2015-12-31 16:34:26
回答 2查看 745关注 0票数 0

实际上,我是angularJS的新手,我的场景是:

代码语言:javascript
复制
$rootScope.synchronization = function($scope, $rootScope, $window, $http) 
{
    if(localStorage.getItem('job_id') != "" && localStorage.getItem('job_id') > 0)
    {
        alert("found job id!"); 
        console.log(localStorage.getItem('job_id'));    
        if(localStorage.getItem('job_id.done_tasks') != "" && localStorage.getItem('job_id.done_tasks') > 0)
        {
            alert("found done tasks ids!");
            console.log(localStorage.getItem('job_id.done_tasks'));

            $scope.done_tasks = {};
            $scope.done_tasks = localStorage.getItem('job_id.done_tasks');
            $scope.job_id = localStorage.getItem('job_id');
            console.log($scope.done_tasks);             
            var userData = $http(
            {
                method: "post",
                url: "http://localhost/t-app/mobile-data/update-tasks.php",
                data: {
                        done_tasks : $scope.done_tasks,
                        job_id: $scope.job_id,
                    },
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
            });
            userData.success(function (userdataobject)
            {
                $rootScope.status_id = userdataobject["status_id"];
                $rootScope.message = userdataobject["message"];

                localStorage.setItem('job_id', '');
                localStorage.setItem('job_id.done_tasks', '');

            })  
        }

        console.log(localStorage.getItem('job_id'));
        console.log(localStorage.getItem('job_id'));
    }

};

在我的控制器中,我使用的是:

代码语言:javascript
复制
$interval( $rootScope.synchronization, 2000 , 1);

现在我得到了这个错误:

代码语言:javascript
复制
Error: [$rootScope:inprog] http://errors.angularjs.org/undefined/$rootScope/inprog?p0=%24digest

代码语言:javascript
复制
app.js (line 48)
Error: $http is not a function
$rootScope.synchronization@http://localhost/task-app/js/app.js:52:20

请帮我解决这个问题……我已经添加了$scope,$rootScope,$window,$http,但仍然不适用于我。请看一下我的方案。

EN

回答 2

Stack Overflow用户

发布于 2015-12-31 16:48:29

你可以在你的控制器中定义这个同步函数,我认为你根本不需要使用rootscope。你可以使用这个控制器;

代码语言:javascript
复制
yourApp.controller("yourController", ['$scope', '$http', '$timeout', 'localStorage',
    function ($scope, $http, $timeout, localStorage) {

        var synchronization = function () {
            if (localStorage.getItem('job_id') != "" && localStorage.getItem('job_id') > 0) {

                if (localStorage.getItem('job_id.done_tasks') != "" && localStorage.getItem('job_id.done_tasks') > 0) {
                    $scope.done_tasks = {};
                    $scope.done_tasks = localStorage.getItem('job_id.done_tasks');
                    $scope.job_id = localStorage.getItem('job_id');

                    var userData = $http({
                        method: "post",
                        url: "http://localhost/t-app/mobile-data/update-tasks.php",
                        data: {
                            done_tasks: $scope.done_tasks,
                            job_id: $scope.job_id
                        },
                        headers: {'Content-Type': 'application/x-www-form-urlencoded'}
                    });
                    userData.success(function (userdataobject) {
                        //* I added response to $scope *//
                        $scope.status_id = userdataobject["status_id"];
                        $scope.message = userdataobject["message"];

                        localStorage.setItem('job_id', '');
                        localStorage.setItem('job_id.done_tasks', '');

                        $timeout(synchronization, 2000);
                    });
                }
            }
        };

    }]);

刚把你的函数复制到控制器和排列的注入..

注意:我使用超时服务每2秒调用一次这个函数,而不是间隔,你可以根据你的需要进行调整,带出同步函数的线路将在2秒后调用一次。

票数 1
EN

Stack Overflow用户

发布于 2015-12-31 16:50:12

正如我从您的调用中看到的那样,您没有将正确的值传递给函数:

$interval( $rootScope.synchronization, 2000 , 1);

Interval调用您的函数,而同步函数需要四个参数:

$rootScope.synchronization = function($scope, $rootScope, $window, $http){/**/}

您可以像这样传递参数:

$interval( $rootScope.synchronization, 2000 , 1, false, $scope, $rootScope, $window, $http);

请注意上面对$interval的调用中的false。这将确保您走出了解决Error: [$rootScope:inprog]$apply周期。$interval的文档是here

另外,我建议将此代码更改为$timeout,因为您只需要这样做一次。此外,你应该使用$window.localStorage而不是localStorage

编辑2:根据OP的评论,服务将是最好的解决方案:

代码语言:javascript
复制
myApp.factory('SynchronizationService', ['$scope', '$rootScope',
    '$window', '$location', '$interval', '$http',
    function ($scope, $rootScope, $window, $location, $interval, $http) {
        return {
            synchronization: function () { /*your code here*/}
        };
    }]);

然后,您可以通过注入服务并调用公开的方法来从控制器调用此方法:

代码语言:javascript
复制
controller('mainCtrl', ['SynchronizationService', function(SyncService) {
    SyncService.synchronization();
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34543506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档