AngularJS/Cordova: deviceready 后如何在工厂中获取值?
AngularJS/Cordova: How can I get values in my factory after deviceready?
我正在尝试使用 Cordova Device 插件来获取有关用户正在使用的设备的信息。文档说它只能在 deviceready
函数之后调用,所以在我的 .run
函数中我有以下内容:
.run(function($rootScope, $state, $stateParams) {
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
console.log(device);
}
//more functions below
效果很好,我在控制台中看到了设备对象,但我真正想要的是在工厂内部使用设备对象,有时会在 deviceready
事件之前调用它。
所以我的问题是如何让 make device 对象在我的工厂可用时可用?我想要类似下面的代码
angular.module('myapp.services.myFactory', [])
.factory('MyFactory', function($q) {
function getDevice () {
//if the deviceready event happend and I can access the device object set to variable
return device;
}
return {
getDeviceInfo: function getDeviceInfo() {
return $q(function(resolve, reject) {
if (getDevice()) {
//do something with the device object
} else {
//do something without device object
}
});
}
};
});
无需在此处利用 .run
- 您应该能够执行 deviceready
中的所有内容,包括您的模块和工厂定义。只需将所有内容都包含在这个事件中。我也不相信你需要 $q
来解决任何承诺。观察以下简化模式...
function onDeviceReady() {
// guessing your dependency architecture
angular
.module('myapp', ['myapp.services'])
.module('myapp.services', ['myapp.services.myFactory'])
.module('myapp.services.myFactory', [])
.factory('MyFactory', function() {
function withDevice() {
/*...*/
}
function withoutDevice() {
/*...*/
}
return {
// turnary. device always available to examine at this point
'getDeviceInfo': device ? withDevice : withoutDevice
}
});
}
document.addEventListener('deviceready', onDeviceReady, false);
我正在尝试使用 Cordova Device 插件来获取有关用户正在使用的设备的信息。文档说它只能在 deviceready
函数之后调用,所以在我的 .run
函数中我有以下内容:
.run(function($rootScope, $state, $stateParams) {
document.addEventListener('deviceready', onDeviceReady, false);
function onDeviceReady() {
console.log(device);
}
//more functions below
效果很好,我在控制台中看到了设备对象,但我真正想要的是在工厂内部使用设备对象,有时会在 deviceready
事件之前调用它。
所以我的问题是如何让 make device 对象在我的工厂可用时可用?我想要类似下面的代码
angular.module('myapp.services.myFactory', [])
.factory('MyFactory', function($q) {
function getDevice () {
//if the deviceready event happend and I can access the device object set to variable
return device;
}
return {
getDeviceInfo: function getDeviceInfo() {
return $q(function(resolve, reject) {
if (getDevice()) {
//do something with the device object
} else {
//do something without device object
}
});
}
};
});
无需在此处利用 .run
- 您应该能够执行 deviceready
中的所有内容,包括您的模块和工厂定义。只需将所有内容都包含在这个事件中。我也不相信你需要 $q
来解决任何承诺。观察以下简化模式...
function onDeviceReady() {
// guessing your dependency architecture
angular
.module('myapp', ['myapp.services'])
.module('myapp.services', ['myapp.services.myFactory'])
.module('myapp.services.myFactory', [])
.factory('MyFactory', function() {
function withDevice() {
/*...*/
}
function withoutDevice() {
/*...*/
}
return {
// turnary. device always available to examine at this point
'getDeviceInfo': device ? withDevice : withoutDevice
}
});
}
document.addEventListener('deviceready', onDeviceReady, false);