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;
});