Javascript 角度:将数据从服务/工厂传递到控制器
我有一个控制器,其中有Javascript 角度:将数据从服务/工厂传递到控制器,javascript,angularjs,ionic-framework,ionic,angular-promise,Javascript,Angularjs,Ionic Framework,Ionic,Angular Promise,我有一个控制器,其中有选择图片功能,用于拍照并在视图中使用此图片 这是控制器中功能的代码: $scope.selectPicture = function() { document.addEventListener('deviceready', function() { var options = { destinationType: Camera.DestinationType.FILE_URI, sourceType
选择图片
功能
,用于拍照并在视图中使用此图片
这是控制器中功能的代码:
$scope.selectPicture = function() {
document.addEventListener('deviceready', function() {
var options = {
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.CAMERA,
correctOrientation: true,
targetWidth: 720,
};
$cordovaCamera.getPicture(options).then(function(imageURI) {
$scope.imageSrc = imageURI;
$scope.img = imageURI;
}, function(err) {
alert(err);
});
}, false); // device ready
}; // Select picture
控制器代码变得混乱,因此我想将摄像头的逻辑投入使用,我执行了以下cameraService
:
.factory('cameraService', function($cordovaCamera, $ionicPlatform) {
var options = {
destinationType: Camera.DestinationType.FILE_URI,
sourceType: Camera.PictureSourceType.CAMERA,
correctOrientation: true,
targetWidth: 720,
};
function takePicture () {
$ionicPlatform.ready(function() {
var img = $cordovaCamera.getPicture(options);
return img;
});
};
return {
takePicture: takePicture
};
});
此外,在注入服务后,我将控制器中的代码固定为:
$scope.selectPicture = function() {
cameraService.takePicture().then(function(imageURI) {
$scope.imageSrc = imageURI;
$scope.img = imageURI;
}, function(err) {
alert(err);
});
};
但是,我似乎做得不对,因为我遇到了以下错误:
无法读取作用域中未定义的属性“then”。$Scope.selectPicture
这是因为
takePicture
不返回承诺(then
是一种承诺方法)。因此:
好的,看来
getPicture
已经返回了一个承诺。所以你只需要归还它。由于用户单击或点击时会触发$scope.selectPicture
,因此每次需要拍照时,您不需要调用$ionicPlatform.ready
。您的服务应该返回承诺,因为它返回承诺,因此不需要$ionicPlatform.ready(function()
方法)
代码
function takePicture () {
var img = $cordovaCamera.getPicture(options);
return img;
});
为什么您的
deviceready
监听器在selectPicture函数中?不再需要它了,因为我用$ionicPlatform替换了它。工厂中的ready
不应该被延迟返回。承诺;
?哦,是的(我用CoffeeScript编程的时间太长了!)您的回答是正确的,在很多情况下,如果不是所有拨打http
的地方都应该这样处理,但是@Pankaj Parkar对$cordovaCamera.getPicture
的回答是正确的,我需要做的就是将“$ionicPlatform”移动到控制器上。@AhmadElmoualem是正确的,$cordovaCamera.getPicturee
已返回承诺(从未编程的Cordova)。已更新。$ionicPlatform.ready
无论何时使用ng文档中提到的插件都是必需的-cordova@AhmadElmoualem您应该从$ionicPlatform.ready
@AhmadElmoualem do upvote中调用“$scope.selectPicture`,如果它确实对您有帮助的话。谢谢
function takePicture () {
var img = $cordovaCamera.getPicture(options);
return img;
});