AngularJS: ошибка в моей глобальной функции $ rootcope не определена, $ scope не определен

0

На самом деле, я новичок в 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, но все еще не работал для меня. Посмотрите мой сценарий, пожалуйста.

  • 0
    где вы определяете первый бит? добавление вашего контроллера / определения приложения было бы хорошо
  • 0
    почему вы вообще пытаетесь использовать $rootScope для этой логики? это работа для службы, а не для $rootScope .
Показать ещё 4 комментария
Теги:

3 ответа

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

  • 0
    Здорово. Спасибо за ваш ответ. Пожалуйста, посмотрите также на этот код .. alert(localStorage.getItem('job_id.done_tasks')); if(localStorage.getItem('job_id.done_tasks') != "" && localStorage.getItem('job_id.done_tasks') > 0) { alert(localStorage.getItem('job_id.done_tasks')); } здесь в этом я не localStorage.getItem('job_id.done_tasks') в условие if .. и мой localStorage.getItem('job_id.done_tasks') похож на 10,13,12 т. д.
  • 0
    Пожалуйста, используйте plnkr и приведите несколько примеров вашей проблемы.
Показать ещё 1 комментарий
1

Вы не передаете правильные значения в функцию, как я вижу из вашего вызова:

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

Интервал вызывает вашу функцию, а для функции синхронизации требуются четыре параметра:

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

Вы можете передать параметры следующим образом:

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

Обратите внимание на false в приведенном выше вызове на $interval. Это гарантирует, что вы вне цикла $apply который разрешает Error: [$rootScope:inprog]. Документы для $interval находятся здесь.

Также я бы предложил изменить этот код на $timeout поскольку вы делаете это только один раз. Кроме того, вы должны использовать $window.localStorage вместо localStorage.

Редактирование 2: на основе комментария OP сервис будет лучшим решением:

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

Затем вы можете вызвать это из контроллера, введя службу и вызвав открытый метод:

controller('mainCtrl', ['SynchronizationService', function(SyncService) {
    SyncService.synchronization();
});
  • 0
    Пожалуйста, проверьте ошибку: Ошибка: $ http не является функцией $ rootScope.synchronization @ localhost / task-app / js / app.js: 52: 20 `все еще здесь ..
  • 0
    пожалуйста, посмотрите plunkr тоже ..
Показать ещё 4 комментария
1

Вы можете определить эту функцию синхронизации в своем контроллере, я не думаю, что вам нужно вообще использовать корнеплод. Вы можете использовать этот контроллер;

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 секунды.

  • 0
    На самом деле я хочу вызвать эту функцию во многих контроллерах ... :(
  • 0
    Если это так, вы должны использовать поставщика фабрики . docs.angularjs.org/guide/providers#factory-recipe
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню