1

ユーザーがクライアントに新しいエントリを追加したら、サーバーから Web サービスを呼び出し (クライアント側のコードはアクセスできません)、MongoDB に保存されているデータに追加情報を追加する必要があります。標準の Meteor.methods/Meteor.call パターンを使用しようとしてもうまくいかないようです。

サーバーとクライアントの両方で [追加] ボタンのクリック イベントをリッスンする必要がありますか? サーバーが反応するクライアントでカスタム イベントを発生させる必要がありますか? サーバー側のメソッドを直接呼び出す適切な方法はありますか? 最も重要なことは、これらすべてにおいて TypeScript を満足させるにはどうすればよいかということです。

Meteor の上にある TypeScript レイヤーは初めてで、for ループがスローされます。私は一般的に 2.0 の Angular-Meteor チュートリアルに従っていますが、この種のことはまだカバーされていません。

4

2 に答える 2

1

はい、データを受信するために、サーバーから Web サービスを直接呼び出すことができます。あなたがどのように をやったのかよくわかりませんが、うまくいかなかったMeteor.methods/Meteor.callと言っています。しかし、基本的には、クライアントがボタンをクリックすると、ボタンがサーバーでメソッドをトリガーするという考え方です。次に、サーバー メソッドが Web サービスを呼び出し、データを返します。

コード例は次のとおりです。

Template['template'].events({
    'click .getData': function(event: any) {
        Meteor.call('serverMethod', function(err, res) {
            if (err) {alert(err);}
            else { ... }

        )
    }
});

残りを呼び出すときの初心者にとって難しい部分は、aysncクライアントにデータを返すために呼び出しを使用する必要があることです。通常、そのためのヘルパー関数を作成します

    public static get(url: string, headers: any): any {
        var httpCall  = Meteor.wrapAsync(HTTP.call);

        var result = httpCall('GET', url, {headers: headers});

        if (result.statusCode == 200) {
            try {
                var res = JSON.parse(result.content);

                return res;
            } catch(err) {
                return result.content;
            }   
        }

        return null;    
    }

そして、このようにヘルパーを呼び出します

public static serverMethod(username: string, password: string): any {
    var response = RestService.get(query.url, query.header); 
    return response;
}

このようにしてres、上記のクライアント コードの が結果を取得します。

私は実際にはドキュメントの不足のために Angular 2 を削除しましたが、私の例でわかるように、すべての流星呼び出しを Typescript クラス内にラップできるため、システムの Typescript を使用し続けますserverMethod。これは、流星ではなく typescript 関数形式です。のようMeteor.methods({....})に、これは今のところ本当に良いです

通常、これはサーバー フォルダー内のクラスです。

// server/rest.service.ts
declare var RestService: any;
RestService = class RestService {

    methodMap = {
        "getFromRest": RestService.get,
        "postToRest": RestService.post,
    };

    constructor() {
        var abstractService = new AbstractService();
        abstractService.registerMethod(this.getClassName(), this.methodMap);        
    }

    getClassName(): string {
        return this.constructor.toString().match(/\w+/g)[1];
    }

    //------------------------------------------------------------------------------------
    // Helper methods
    //------------------------------------------------------------------------------------
    public static get(url: string, headers: any): any {
        var httpCall  = Meteor.wrapAsync(HTTP.call);

        var result = httpCall('GET', url, {headers: headers});

        if (result.statusCode == 200) {
            try {
                var res = JSON.parse(result.content);

                return res;
            } catch(err) {
                return result.content;
            }   
        }

        return null;    
    }

meteorタイプスクリプトサービスをメソッドにマップするクラスがあります

// server/abstract.service.ts
declare var AbstractService: any;
AbstractService = class AbstractService {
    constructor() {}

    public registerMethod (scopeName: string, methodMap: {[key:string]:any}) {
        var scopeMap: {[key:string]: any} = {};

        for (var key in methodMap) {
            scopeMap[scopeName + '.' + key] = methodMap[key];
        }

        Meteor.methods(scopeMap);
    }
于 2015-12-29T02:14:04.310 に答える
0

angular2、Meteor、Typescript を使用して、機能するのは Meteor.methods をチェーンすることです。

最初にクライアントで、ボタンのクリックに応答して ...
Meteor.call('importCsv',id,function(error,result) { ...

collections/methods フォルダーなどで、メソッドを次のように定義します。

Meteor.methods({
 'importCsv': function(id) {
    console.log('importCsv method on client');
    Meteor.call('importCsvServer',id);

 }

});

server/ フォルダ内に、ファイルに次のようなメソッドが含まれています。

Meteor.methods({
'importCsvServer': function(id) {

....

server/main.ts で collections/methods/filename をインポートします。client/app.ts に同じものをインポートします。クライアントの Meteor.call は最初のメソッドを正常に呼び出し、次に server/ フォルダー内の 2 番目のメソッドを呼び出します。

私の目標は、クライアントによって開始されたサーバー上で一連の処理を行うことです。コレクション/メソッドで定義されたメソッドの関数呼び出しをクライアントとサーバーの両方にインポートすると、コンパイラ エラーが発生しました。

Angular2-流星の問題 74

于 2016-01-26T00:17:02.117 に答える