为什么我不能 set/get $rootScope?
Why I can't set/get $rootScope?
我尝试在 .运行() 中的 $rootScope 中设置一个值,并尝试在服务中获取它,但它看起来像是未定义的。
.运行() 和服务中的其他所有内容 运行ning 都很好。
.run(function($ionicPlatform, $translate, $rootScope) {
document.addEventListener("deviceready",function(){ onDeviceReady($rootScope); }, false);
function onDeviceReady($rootScope) {
if(typeof navigator.globalization !== "undefined") {
navigator.globalization.getPreferredLanguage(function(language) {
$rootScope.language='en'; //(language.value).split('-')[0];
$translate.use((language.value).split("-")[0]).then(function(data) {
console.log("SUCCESS -> " + data);
}, function(error) {
console.log("ERROR -> " + error);
});
}, null);
}
}
})
.service('Webcache', function ($http, $q, apiHost, $rootScope) {
return {
getDataBySection: function (section, version, params) {
var params = params || {};
var host = apiHost;
var deferred = $q.defer();
var start = new Date().getTime();
params.lang = $rootScope.language;
$http.get('http://'+ host +'/api/'+ version +'/'+ section, {
cache: true,
params: params
}).success(function (response) {
deferred.resolve(response);
}).error(function (response){
deferred.resolve(false);
});
return deferred.promise;
}
};
})
当您尝试执行代码时,设备似乎还没有准备好,您是否尝试过使用 $ionicPlatform.ready
?
像这样:
.run(appRun);
appRun.$inject = ['$ionicPlatform', '$translate', '$rootScope'];
function appRun ($ionicPlatform, $translate, $rootScope) {
$ionicPlatform.ready(function () {
if(typeof navigator.globalization !== "undefined") {
navigator.globalization.getPreferredLanguage(function(language) {
$rootScope.language='en'; //(language.value).split('-')[0];
$translate.use((language.value).split("-")[0]).then(function(data) {
console.log("SUCCESS -> " + data);
}, function(error) {
console.log("ERROR -> " + error);
});
}, null);
}
});
}
您根本不应绑定到 onDeviceReady
事件。 Ionic 为您提供了一种 angular 兼容的处理方式:$ionicPlatform.ready()
其中 returns 一个承诺。使用它会使您的代码看起来像这样:
.run(function($ionicPlatform, $translate, $rootScope, $q, $log) {
$rootScope.languagePromise = $ionicPlatform.ready()
.then(function() {
return $q(function(resolve, reject) {
if(angular.isDefined(navigator.globalization)) {
navigator.globalization.getPreferredLanguage(function(language) {
$translate.use((language.value).split("-")[0]).then(function(data) {
$log.debug("SUCCESS -> " + data);
resolve(language);
}, function(error) {
$log.debug("ERROR -> " + error);
reject(error);
});
}, null);
} else { resolve('en'); }
});
});
})
这在范围内做出了承诺,您可以随时使用它来立即(如果初始化已完成)或在它可用时获取该语言。
.service('Webcache', function ($http, apiHost, $rootScope) {
return {
getDataBySection: function (section, version, params) {
params = params || {};
var host = apiHost;
return $rootScope.languagePromise.then(function(language) {
params.lang = language;
return $http.get('http://'+ host +'/api/'+ version +'/'+ section, {
cache: true,
params: params
}).catch(function (){
return false;
});
});
}
};
})
getDataBySection
直接方法 returns 等待语言承诺的结果又取决于 $http
承诺的结果,因此响应数据将传播回来至于你现有的代码。
我尝试在 .运行() 中的 $rootScope 中设置一个值,并尝试在服务中获取它,但它看起来像是未定义的。 .运行() 和服务中的其他所有内容 运行ning 都很好。
.run(function($ionicPlatform, $translate, $rootScope) {
document.addEventListener("deviceready",function(){ onDeviceReady($rootScope); }, false);
function onDeviceReady($rootScope) {
if(typeof navigator.globalization !== "undefined") {
navigator.globalization.getPreferredLanguage(function(language) {
$rootScope.language='en'; //(language.value).split('-')[0];
$translate.use((language.value).split("-")[0]).then(function(data) {
console.log("SUCCESS -> " + data);
}, function(error) {
console.log("ERROR -> " + error);
});
}, null);
}
}
})
.service('Webcache', function ($http, $q, apiHost, $rootScope) {
return {
getDataBySection: function (section, version, params) {
var params = params || {};
var host = apiHost;
var deferred = $q.defer();
var start = new Date().getTime();
params.lang = $rootScope.language;
$http.get('http://'+ host +'/api/'+ version +'/'+ section, {
cache: true,
params: params
}).success(function (response) {
deferred.resolve(response);
}).error(function (response){
deferred.resolve(false);
});
return deferred.promise;
}
};
})
当您尝试执行代码时,设备似乎还没有准备好,您是否尝试过使用 $ionicPlatform.ready
?
像这样:
.run(appRun);
appRun.$inject = ['$ionicPlatform', '$translate', '$rootScope'];
function appRun ($ionicPlatform, $translate, $rootScope) {
$ionicPlatform.ready(function () {
if(typeof navigator.globalization !== "undefined") {
navigator.globalization.getPreferredLanguage(function(language) {
$rootScope.language='en'; //(language.value).split('-')[0];
$translate.use((language.value).split("-")[0]).then(function(data) {
console.log("SUCCESS -> " + data);
}, function(error) {
console.log("ERROR -> " + error);
});
}, null);
}
});
}
您根本不应绑定到 onDeviceReady
事件。 Ionic 为您提供了一种 angular 兼容的处理方式:$ionicPlatform.ready()
其中 returns 一个承诺。使用它会使您的代码看起来像这样:
.run(function($ionicPlatform, $translate, $rootScope, $q, $log) {
$rootScope.languagePromise = $ionicPlatform.ready()
.then(function() {
return $q(function(resolve, reject) {
if(angular.isDefined(navigator.globalization)) {
navigator.globalization.getPreferredLanguage(function(language) {
$translate.use((language.value).split("-")[0]).then(function(data) {
$log.debug("SUCCESS -> " + data);
resolve(language);
}, function(error) {
$log.debug("ERROR -> " + error);
reject(error);
});
}, null);
} else { resolve('en'); }
});
});
})
这在范围内做出了承诺,您可以随时使用它来立即(如果初始化已完成)或在它可用时获取该语言。
.service('Webcache', function ($http, apiHost, $rootScope) {
return {
getDataBySection: function (section, version, params) {
params = params || {};
var host = apiHost;
return $rootScope.languagePromise.then(function(language) {
params.lang = language;
return $http.get('http://'+ host +'/api/'+ version +'/'+ section, {
cache: true,
params: params
}).catch(function (){
return false;
});
});
}
};
})
getDataBySection
直接方法 returns 等待语言承诺的结果又取决于 $http
承诺的结果,因此响应数据将传播回来至于你现有的代码。