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

时间:2015-12-31 08:34:26

标签: javascript angularjs

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

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

};

在我的控制器中使用它:

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

现在我收到了这个错误:

Error: [$rootScope:inprog] http://errors.angularjs.org/undefined/$rootScope/inprog?p0=%24digest

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但仍然没有为我工作。请看看我的情景。

3 个答案:

答案 0 :(得分:1)

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

$url = "https://api.livechatinc.com/chats?\date_from=2015-01-01";
$curl = curl_init();
curl_setopt($curl, CURLOPT_USERPWD, "$username:$password");
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

$result = curl_exec($curl);
echo $result;

刚刚将您的功能复制到控制器并进行了直接注射..

注意:我使用超时服务每2秒调用一次此功能而不是间隔,你可以根据需要调整一下,携带同步线的功能会在2秒后调用一次。

答案 1 :(得分:1)

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

$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。这样可以确保您不在解决$apply的{​​{1}}周期内。 Error: [$rootScope:inprog]的文档为here

另外,我建议您将此代码更改为$interval,因为您只需执行一次。此外,您应该使用$timeout代替$window.localStorage

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

localStorage

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

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

答案 2 :(得分:1)

您应该更改函数($ interval)调用 这是我的建议:

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

$inverval API

更好地解决您的问题:

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

$timeout API