2016-08-26 8 views
0

1週間前にnativescriptを使用して小さなアプリケーションを作成しています。 アイテムのリストをリスト表示しています。アイテムがクリックされると、リモートサーバーにdeatilsのリクエストを出しています。私の意図は、応答を取得し、別のページに文脈でそれを送信することです。ここ はアイテムが私が部屋を印刷するとき、私は何もnativescriptでクラス内のメソッドを適切に公開する方法

import config = require("../config"); 
import requestor = require("../request"); 

export class HotelDetailViewModel { 
    getRooms(id: number) { 
     var url = config.apiUrl + "hotels/" + id; 
     var rooms = []; 
     requestor.get(url).then((response) => { 
      response.hotel.room_types.forEach(room => { 
       console.log(room.name); 
       rooms.push({ 
        name: room.name, 
        price: room.price, 
        id: room.id 
       }); 
      }); 
     }); 
     return rooms; 
    } 
} 

このファイルが正しく応答を印刷しないが、私はされ得る

import { HotelDetailViewModel } from "../../shared/view-models/hotel-detail-view-model"; 
import navigationModule = require("../../shared/navigation"); 

export function selectHotel(args) { 
    let id = args.view.HotelId; 
    var hotel = new HotelDetailViewModel(); 
    var rooms = hotel.getRooms(id); 
    console.log(rooms); 
    navigationModule.goToHotelDetail(rooms); 
} 

をクリックされたときに、この機能がトリガされた私の試み

です上のスニペットでgetRoomsを呼び出すと何も得られません。何か案が?

私はそれを動作させる方法を理解することができます。
私がしようとしていることを達成するためのより良いアプローチがある場合は、私にどのように教えてください。 getRooms()はまだhttpリクエストを行っているとrooms変数は任意の項目を押していない状態であるため、あなたconsole.logで事前

+0

あなたの方法は、非同期呼び出しを行うようだと、それは空のリストを返す理由です。あなたがconsole.logにそれを渡したときには満たされませんでした。約束を返すようにして、延期されたデータの処理を呼び出し側に委任してください。 – Sombriks

答えて

0


感謝。 getRooms()は次のように約束を返してください:

export class HotelDetailViewModel { 
    getRooms(id: number) { 
     return new Promise<any>((resolve, reject) => { 
      var url = config.apiUrl + "hotels/" + id; 
      var rooms = []; 
      requestor.get(url).then((response) => { 
       response.hotel.room_types.forEach(room => { 
        console.log(room.name); 
        rooms.push({ 
         name: room.name, 
         price: room.price, 
         id: room.id 
        }); 
       }); 
      }); 
      resolve(); 
     } 
    } 
} 

を次にコントローラでは、次のことができ

var hotel = new HotelDetailViewModel(); 
var rooms; 
hotel.getRooms(id).then((result) => { 
    console.log(r); 
    rooms = result; 
}); 
+0

こんにちは、私はあなたのアプローチを使用していますが、私は約束を返すエラーが発生しました。 名前 'T'が見つかりません。私はd.tsファイルを追加しましたが、エラーはそのままです – Odracir

+0

申し訳ありませんが、これは私のプロジェクトで使用したものです。 "T"を "any"で置き換えるだけです。私は答えを更新します。 –

関連する問題