[英]AngularJS: Error in my global function of $rootscope not defined, $scope not defined
實際上,我是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,但仍然對我不起作用。 請看看我的情況。
您可以在控制器中定義此同步功能,我認為您根本不需要使用rootscope。 您可以使用此控制器;
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秒后調用一次。
正如您從調用中看到的那樣,您沒有將正確的值傳遞給函數:
$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
周期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();
});
您應該更改函數($ interval)調用,這是我的建議:
$interval($rootScope.synchronization, 2000 , 1, false, $scope, $rootScope, $window, $http);
為您的問題提供更好的解決方案:
$timeout($rootScope.synchronization, 2000, false, $scope, $rootScope, $window, $http);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.