Typescript 类中的Ionic2私有属性始终为空,即使在该类中进行了设置
我是Ionic2和TypeScript的新手,尝试使用类、属性、getter和setter。 我的第一个类只是初始化webSQL数据库中的一些数据,并公开检索信息的方法,我想在其他类中使用这些方法:Typescript 类中的Ionic2私有属性始终为空,即使在该类中进行了设置,typescript,ionic2,javascript-objects,Typescript,Ionic2,Javascript Objects,我是Ionic2和TypeScript的新手,尝试使用类、属性、getter和setter。 我的第一个类只是初始化webSQL数据库中的一些数据,并公开检索信息的方法,我想在其他类中使用这些方法: import { Injectable } from '@angular/core'; import * as PouchDB from 'pouchdb'; @Injectable() export class ezStockService { private _db;
import { Injectable } from '@angular/core';
import * as PouchDB from 'pouchdb';
@Injectable()
export class ezStockService {
private _db;
private _areas: any = [];
private _ezstockzs;
initDB(){
this._db = new PouchDB('ezstockz', {adapter: 'websql'});
var self = this;
/**
* Crée éventuellement les zones de stockage par défaut
**/
this._db.get("area_1").catch(function(error){
if(error.name === 'not_found'){
return {
_id: "area_1",
libelle:[
{
"lang": "FR-fr",
"value": "Nord"
},
{
"lang": "EN-en",
"value": "North"
}
],
"logo": "images/boussole.png"
}
}
}).then(function(gmDoc){
self._db.put(gmDoc);
});
this._db.get("area_2").catch(function(error){
if(error.name === 'not_found'){
return {
_id: "area_2",
libelle:[
{
"lang": "FR-fr",
"value": "Sud"
},
{
"lang": "EN-en",
"value": "South"
}
],
"logo": "images/boussole.png"
}
}
}).then(function(fgDoc){
self._db.put(fgDoc);
});
this._db.get("area_3").catch(function(error){
if(error.name === 'not_found'){
return {
_id: "area_3",
libelle:[
{
"lang": "FR-fr",
"value": "Est"
},
{
"lang": "EN-en",
"value": "East"
}
],
"logo": "images/boussole.png"
}
}
}).then(function(cgDoc){
self._db.put(cgDoc);
});
}
/**
* Method that retrieve all areas
**/
allAreas() {
this._db = new PouchDB('ezstockz', {adapter: 'websql'});
this._areas = [];
var self = this;
this._db.allDocs({
startkey: 'area_',
endkey: 'area_\uffff',
include_docs: true
}).then(function(areas){
var rows = areas.rows;
var zones = [];
rows.forEach((item,index) => {
var area = {
"libelle": item.doc.libelle[0].value,
"image": item.doc.logo
};
zones.push(area);
});
return zones;
}).then(function(areas){
self._areas = areas;
});
}
/**
* Method that get areas
**/
get areas(){
return this._areas;
}
}
在我的应用程序的其他地方,我想列出视图中的所有区域,因此,在另一个类中,尝试使用areas getter,如下所示:
import { Component } from '@angular/core';
import { NavController, Platform } from 'ionic-angular';
import { ezStockService } from '../../services/ez-stock.service';
@Component({
selector: 'page-stocks',
templateUrl: 'stocks.html'
})
export class Stocks {
public stocks = [];
items: any;
constructor(public navCtrl: NavController,
private platform: Platform,
private stockService: ezStockService ) {
this.items = [];
var self = this;
stockService.allAreas(); // Invoke method
var areas = stockService.areas; // Invoke getter
console.log("Zones : (" + areas.length + ")");
}
}
即使allAreas()方法返回数组中的3项,console.log的结果始终为“0”
不知道为什么会出现这种行为,不了解TypeScript中的属性范围
Thx 4您的帮助…在线
stockService.allAreas(); // Invoke method
你应该
stockService.allAreas().then(function(){
var areas = stockService.areas; // Invoke getter
console.log("Zones : (" + areas.length + ")");
}); // Invoke method
这是因为这是一个不同步的呼叫。这是一个承诺,完成后必须解决。Thx。。。这是否意味着必须在调用的方法中编写一个defered.resolve()。@Jean LucAubert是的,您可以