2017-01-15 4 views
0

Я новичок в Ionic2 и TypeScript и стараюсь играть с классами, свойствами, геттерами и сеттерами. Мой первый класс только инициализировать некоторые ДАННЫЕ в базе данных WebSQL и разоблачать методы, которые считывают Infos, что я хочу использовать в других классах:Свойство Ionic2 в классе всегда пустое, даже если оно установлено в этом классе

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

В другом месте в мое приложение, я хотел бы перечислить все области, в целях , так, в другом классе, попытайтесь использовать участки добытчика как так:

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

результат console.log всегда «0», даже если allAreas метод() возвращает 3 элемента в массиве ...

Не знаю, почему это поведение, не понимаю Свойства области видимости в машинописном ...

Thx 4 Ваша помощь ...

ответ

0

В строке

stockService.allAreas(); // Invoke method 

вы должны

stockService.allAreas().then(function(){ 
    var areas = stockService.areas; // Invoke getter 
    console.log("Zones : (" + areas.length + ")");  
}); // Invoke method 

Это, это потому, что это asychronous вызов. Это обещание, которое нужно решить, когда оно будет завершено.

+0

Thx ... Означает ли это, что необходимо написать debff.resolve() в вызываемом методе? –

+0

@ Jean-LucAubert да, вы можете –