На самом деле, я новичок в 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, но все еще не работал для меня. Посмотрите мой сценарий, пожалуйста.
Вы должны изменить вызов функции ($ interval). Это мое предложение:
$interval($rootScope.synchronization, 2000 , 1, false, $scope, $rootScope, $window, $http);
Лучшее решение для вашей проблемы:
$timeout($rootScope.synchronization, 2000, false, $scope, $rootScope, $window, $http);
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
т. д.
Вы не передаете правильные значения в функцию, как я вижу из вашего вызова:
$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();
});
Вы можете определить эту функцию синхронизации в своем контроллере, я не думаю, что вам нужно вообще использовать корнеплод. Вы можете использовать этот контроллер;
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 секунды.
$rootScope
для этой логики? это работа для службы, а не для$rootScope
.