- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一系列需要以同步顺序执行的函数。其中一个功能是使用 Cordova 相机库从用户的手机获取图片。另一个函数获取图像源并将其绘制在 DOM 中。
我使用 Angular Promise 和 $q 库来处理同步执行。然而,似乎它以某种方式导致在按顺序执行函数时不更新 DOM,即使图像已成功捕获并且我有 url (ImageData)。
为了测试,我添加了一个函数,该函数使用从手机捕获图像时保存的 url 在 DOM 上绘制图像。这确实有效。所以我的 Angular Promise 的使用和处理肯定有问题。
我该如何解决这个问题?
Controller (注入(inject) $q)
var sGetImage = function() {
var imageSrcOutput = "";
$scope.imageDataSrc = null;
try {
imageSrcOutput = CloakService.getImageData()
.then(function(imageData) {
//$scope.imageData = imageData;
$scope.imageDataSrc = "data:image/jpeg;base64," + imageData;
//$scope.imgURI = $scope.imageDataSrc;
return "data:image/jpeg;base64," + imageData;
});
// catch any errors with a struddle image
} catch (error) {
window.alert("No Image Picked. Drawing Struddle");
imageSrcOutput = "img/struddle.jpg";
$scope.imageDataSrc = imageSrcOutput;
}
return imageSrcOutput;
}
var sDrawImage = function(imageSrc) {
var deferred = $q.defer();
deferred.resolve(imageSrc)
window.alert("drawing image now with: " + imageSrc)
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.src = imageSrc;
img.onload = ctx.drawImage(img, 0, 0);
return deferred.promise;
}
//执行周期(在 Controller 中)
sInit() // works fine
.then( sGetImage ) // image loaded in imageSrcOutput and $scope.imageDataSrc succesfully
.then( sDrawImage ) // here is the problem, it does not draw the images (tried both imageSrcOutput and $scope.imageDataSrc)
.then( sAddBanner )
.catch(function(error) {
window.alert("Catch Error: " + error)
})
服务(注入(inject)$cordovaCamera)
var getImageData = function() {
var deferred = $q.defer();
var options = getOptions('CAMERA');
var imageDataOutput = $cordovaCamera.getPicture(options).then(function(imageData) {
// window.alert(imageData)
deferred.resolve(imageData)
return imageData; //todo:check
}, function(error) {
deferred.reject(error)
window.alert(error)
});
function getOptions(source) {
var options = {
quality: 75,
destinationType: Camera.DestinationType.DATA_URL,
sourceType: Camera.PictureSourceType.PHOTOLIBRARY,
allowEdit: true,
encodingType: Camera.EncodingType.JPEG,
targetWidth: 300,
targetHeight: 300,
popoverOptions: CameraPopoverOptions,
saveToPhotoAlbum: true
};
return options;
}
return deferred.promise;
//return imageDataOutput;
}
app.js
'use strict';
angular.module('myApp', [
'ionic',
'myApp.config',
'myApp.controllers',
'myApp.decorators',
'myApp.directives',
'myApp.filters',
'myApp.routes',
'myApp.services',
'angular-loading-bar',
'ngCordova' // the library to handle the picture
])
.run(function($ionicPlatform) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if(window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
}
});
})
最佳答案
这是问题吗:
img.onload=ctx.drawImage(img, 0, 0);
onload
处理程序必须是一个函数。您正在立即执行 ctx.drawImage()
。
试试这个:
img.onload = function () { ctx.drawImage(img, 0, 0); };
仅供引用,您在 sDrawImage
(和其他地方)中使用 $q.defer()
所做的事情是不必要的。如果您想将 imageSrc
传递到下一步,您可以这样做:
var sDrawImage = function(imageSrc) {
window.alert("drawing image now with: " + imageSrc)
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.src = imageSrc;
return $q(function (resolve) {
img.onload = function () {
ctx.drawImage(img, 0, 0);
resolve(imageSrc);
};
});
};
每当您想到使用$q.defer()
时,您都应该问自己“我真的需要这个吗?”。 99.5% 的情况下,答案应该是“否”。
关于javascript - 如何正确使用 Cordova Camera 的 AngularJS Promise?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28167572/
我使用plugman命令在cordova中创建了一个插件 它创建了所有必需的文件。然后我在插件中添加了android平台。 然后我尝试将它添加到 cordova 应用程序中。我成功添加了它,但是当我尝
我使用plugman命令在cordova中创建了一个插件 它创建了所有必需的文件。然后我在插件中添加了android平台。 然后我尝试将它添加到 cordova 应用程序中。我成功添加了它,但是当我尝
我正在尝试在较旧的 Atrix 上安装一个应用程序,在 S3 上运行良好。搜索论坛可能的问题是SDK版本较高(Atrix是4.0.4)。修复显然是在设置 API 级别。 但是当我运行 cordova
使用 cordova build在一个为期一年的项目中提出: :processDebugResources my_project/platforms/android/build/intermediat
我有一个可以创建文件的可运行应用程序。 我正在寻找一种工作后数小时从cordova应用程序中删除文件的方法。我似乎无法使其正常工作。 这是用于创建和删除文件的代码: function crea
有什么区别吗Cordova 构建 Android 和 Cordova 准备 Android 命令? Reference is added here 最佳答案 准备将您的 www Assets 和任何插
我检查了文档,但没有找到关于此命令的明确说明。 那么,有谁知道cordova prepare命令的作用是什么? 是否更新特定于平台的www文件夹? 如果是,它将复制根www的全部内容吗? 它会更新平台
我们正在开发正在使用Cordova(专用于Ionic)的移动应用程序,并且正在使用PhoneGap PushPlugin和Amazon SNS进行推送通知。反过来,这会撞到我们与Amazon SNS进
我正在使用Vue,Webpack和Cordova。 Videos 如果我在没有Cordova的情况下加载页面,并且在Firefox浏览器中,则可以使用Youtube视频上的全屏图
因此,我尝试在我的(正在运行的)Ionic应用程序中安装一个新插件,该文件名为https://ionicframework.com/docs/native/firebase-dynamic-links
我像这样安装了cordova: C:\Windows\system32>npm install -g cordova 我明白了: C:\Users\cyril\AppData\Roaming\npm\
我有一个 cordova 应用程序,我使用以下代码捕获了后退按钮: document.addEventListener("backbutton", function (e) { bac
如何在 Cordova 中的蓝牙设备和 Android/iOS 之间发送和接收一系列数据字节? 我的项目的详细信息: 我正在开发一个蓝牙传感器设备。设备以一系列字节的形式发送数据。它还对设备 API
我是 cordova 开发的新手。我使用 Onsen UI (1.2.1) 作为布局框架。ons-toolbar 上的标题有问题。 someTextHere 如果我在 ripple 上运行
我有一个启用了平台浏览器的 Cordova 应用程序。我想在 Chrome 中使用摄像头,但调用摄像头根本没有任何反馈。它在我的 Android 设备上就像一个魅力。 我通过这个命令启动:cordov
我对thid docs https://firebase.google.com/docs/android/setup#available_libraries中提到的根级和应用程序级的路径目录感到困惑
喜欢这些插件 https://github.com/ArchieGoodwin/SilentShot https://github.com/alongubkin/phonertc 他们没有 tarba
我有一个 Angular 2 应用程序,我正在将其构建到 cordova 中并部署到 Android/IOS。我没有使用 ionic,我见过许多使用 ionic 的解决方案,但我现在无法将整个项目转换
当我发出命令时,在带有 Cordova 的 Ionic 3 中: ionic cordova run android --emulate 它给出以下消息: BUILD FAILED in 3s
我无法在 ionic 5.2.4v 中安装软件包 cordova-res 并收到以下错误。 命令:cordova-res C:\hanu\cordova-res-master\cordova-res
我是一名优秀的程序员,十分优秀!