我正在尝试建立一个条形码扫描器应用与离子框架。scan.page.ts中的函数工作良好,但不幸的是只有一次。我扫描了一个条形码后,扫描器就再也打不开了。
import { Component, OnInit } from '@angular/core';
import { BarcodeScanner } from '@ionic-native/barcode-scanner/ngx';
import { DataServiceService } from '../../app/data-service.service';
import { Toast } from '@ionic-native/toast/ngx';
import { Router } from '@angular/router';
import { Platform, AlertController } from '@ionic/angular';
import * as moment from 'moment';
@Component({
selector: 'app-scan',
templateUrl: './scan.page.html',
styleUrls: ['./scan.page.scss'],
})
export class ScanPage implements OnInit {
productViews: any = {};
productViewsbyUser: any[] = [];
isProdcutsAvailable = true;
selectedProduct: any;
isCameraOpen = false;
showScan = false;
products: any[] = [];
productFound = true;
displayUserName: any;
exitModalDisplayed = false;
constructor(
private barcodeScanner: BarcodeScanner,
private router: Router,
public platform: Platform,
private toast: Toast,
public dataService: DataServiceService,
public alertCtrl: AlertController) {
console.log(`Scan Page called`);
}
ngOnInit() {
this.dataService.getProducts()
.subscribe((response) => {
this.products = <any[]><unknown>response;
console.table(this.products);
});
this.scan();
this.handleBackButton();
}
getMoment() {
return moment().milliseconds(0);
}
// Start scanning procedure
scan() {
this.selectedProduct = {};
this.isCameraOpen = true;
this.showScan = true;
this.barcodeScanner.scan().then((barcodeData) => {
setTimeout(() => {
this.isCameraOpen = false;
}, 500);
if (barcodeData.cancelled) {
return;
}
console.log(`barcodeData`, barcodeData);
this.selectedProduct = this.products.find(product => product.plu === barcodeData.text);
if (this.selectedProduct !== undefined) {
this.selectedProduct.scannedAt = this.getMoment().toISOString();
// this.selectedProduct.userName = this.displayUserName(); // TO TEST !!!
this.productFound = true;
// insert product views with firebase generated based key
this.dataService.insertProductViewAnalaytics(this.selectedProduct)
.subscribe(() => {
console.log(`Product view analytics inserted in Firebase`);
this.initScanHistoryData();
});
} else {
this.productFound = false;
this.toast.show(`Product not found`, '5000', 'center').subscribe(
toast => {
console.log(toast);
}
);
}
}, (err) => {
setTimeout(() => {
this.isCameraOpen = false;
}, 1000);
this.toast.show(err, '5000', 'center').subscribe(
toast => {
console.log(toast);
}
);
});
}
async initScanHistoryData() {
this.dataService.getProductViewsForUser()
.subscribe((response) => {
this.productViews = response;
const userProductViews = [];
// tslint:disable-next-line: forin
for (const key in this.productViews) {
userProductViews.push(this.productViews[key]);
}
userProductViews.sort(function (a, b) {
return moment(b.scannedAt).diff(moment(a.scannedAt));
// ENTER USER NAME HERE???
});
this.productViewsbyUser = userProductViews;
console.log('user productViews ', userProductViews);
if (this.productViewsbyUser.length) {
this.isProdcutsAvailable = true;
} else {
this.isProdcutsAvailable = false;
}
console.log('productViews ', this.productViews);
});
}
handleBackButton() {
this.platform.backButton.subscribeWithPriority(9999, () => {
console.log('exit');
if (this.exitModalDisplayed || this.isCameraOpen) {
return;
}
this.exitModalDisplayed = true;
const alert = this.alertCtrl.create({
header: 'Do you want to Exit?',
// message: 'Do you want Exit?',
buttons: [
{
text: 'Cancel',
role: 'cancel',
cssClass: 'secondary',
handler: () => {
console.log('Cancel clicked');
this.exitModalDisplayed = false;
}
},
{
text: 'Yes',
handler: () => {
console.log('Confirm Okay');
navigator['app'].exitApp();
}
}
]
});
alert.then(x => x.present());
});
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { TabsPage } from './tabs.page';
const routes: Routes = [
{
path: 'tabs',
component: TabsPage,
children: [
{ path: 'profile', loadChildren: '../profile/profile.module#ProfilePageModule' },
{ path: 'products', loadChildren: '../products/products.module#ProductsPageModule' },
{ path: 'scan', loadChildren: '../scan/scan.module#ScanPageModule' },
]
},
{
path: '',
redirectTo: '/tabs/products',
pathMatch: 'full'
}
];
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
RouterModule.forChild(routes)
],
declarations: [TabsPage]
})
export class TabsPageModule {}
<ion-tabs>
<ion-tab-bar slot="bottom">
<ion-tab-button tab="products">
<ion-icon name="md-list"></ion-icon>
<ion-label>Products</ion-label>
<!-- <ion-badge>6</ion-badge> -->
</ion-tab-button>
<ion-tab-button tab="scan">
<ion-icon name="md-qr-scanner"></ion-icon>
<ion-label>Scan</ion-label>
</ion-tab-button>
<ion-tab-button tab="profile">
<ion-icon name="md-person"></ion-icon>
<ion-label>Profile</ion-label>
</ion-tab-button>
</ion-tab-bar>
</ion-tabs>
我希望每次按下“扫描”选项卡按钮时,扫描仪都会打开。
现在,您的scan()
函数只在调用ngoninit()
时执行。
如果您希望在每次用户单击选项卡时执行它,可以执行以下操作:
<ion-tab-button tab="scan" (click)="scan()">
<ion-icon name="md-qr-scanner"></ion-icon>
<ion-label>Scan</ion-label>
</ion-tab-button>
我有两个s类型的。对于每个都有一个相应的,里面有一个。 我希望单击按钮会产生与单击标签相同的效果:检查相应的输入。 然而,这并没有发生。如下面的代码段所示,悬停并按下按钮确实会触发单选按钮中相应的样式更改,但单击操作不会选择输入,即使简单标签按预期工作。 我已经检查了s是s的合法子代。标签允许短语化内容,按钮是短语化内容,所以那里应该一切正常。 我还尝试将事件侦听器添加到两个按钮的单击事件中,并在
我有一个图像视图和一个按钮,我想要什么,当我点击按钮我想旋转图像视图10度。请帮帮我。 下面是我使用的代码
问题内容: 如何通过单击按钮时的Javascript 更改标签的属性值? 问题答案: 如果没有,则单击将重新加载当前页面,因此您需要执行以下操作: 或防止这样的滚动: 或在您的函数中: ....或者不打扰的方式:
我试图从父组件按钮单击调用每个子组件函数。尝试使用道具并在componentDidMount函数中将按钮单击指定给新函数,但结果是只有最后一个函数警报(“child2保存”);在按钮点击时被分配和执行,我期望警报(“child1保存”);也将被执行。 如何在父组件上单击要调用的每个子函数按钮,注意子组件在父组件内部有相当大的嵌套级别。
问题内容: 我正在尝试编写Django应用程序,而我却被困在单击按钮时如何调用视图函数。 在我的模板中,我有一个如下所示的链接按钮,单击该按钮会将您带到另一个网页: 单击按钮时,我还想调用Django视图函数(以及重定向到目标网站)。查看功能使数据库中的值增加,该值存储了单击按钮的次数。 该是到外部网站(如链接 www.google.com )。现在,单击该按钮时,它将打开一个新窗口,该窗口将您带
问题内容: 我正在开发我的第一个android计算器应用程序。我陷入一个单一的缺陷。我添加了几个按钮,然后单击这些按钮,它将把各自的文本放在“ 字段”上。主要问题描述如下:在运行项目时,必须单击两次按钮才能将相应的文本首次放置在字段上。例如,单击时将“ 1”放在字段上。在运行时,首先单击该按钮无效。仅在第二次单击时,它将“ 1”放在字段上。 该守则如下: XML按钮和EditField, Main