2017-01-20 10 views
5

私はemberコンポーネントからajax呼び出しを行う正しい方法が何であるか知っています。たとえばEmberJsコンポーネントからajax呼び出しを行う正しい方法ですか?

私は従業員のIDで従業員を検索する再利用可能なコンポーネントを作成したいのですが、その応答がサーバーから返ってくると、モデルをajaxレスポンスのデータで更新したいと考えています。

これが正しい方法であるかどうかわかりませんが、私はemberjsで本当に新しいです。 BEと通信するために、この

actions: { 
    doSomething() { 
    Ember.$.post('http://your-api-endpoint', data).then(function(response){ /* your callback code */}); 
    } 
} 

そして、他の方法は、(あなたが言ったように)、その後のルートであなたが得ることができるエンバーストアを使用することであるようにそれが見えたので、私はアクションで直接エンバークラスを使用していた

export default Ember.Component.extend({ 
ajax: Ember.inject.service(), 
actions: { 
    doSearch() { 
     showLoadingData(); 
     var self = this; 
     this.get('ajax').post('http://server.ip.com/api/v1/getEmployee', { "id": this }).then(function(data) { 
      self.set('model.name', data.name); 
      self.set('model.position', data.position); 
      hideLoadingData(); 
     }); 
    } 
}}); 

答えて

2

EDITからモデル私の答えの日付バージョン:

まず、ember-dataを使うべきだと思います。従業員をIDで取得すると、this.get("store").find("employee", id)が呼び出されます。

plain ajaxを使用する場合は、仕様(APIエンドポイントURL、データ形式など)をカプセル化し、モデルの検索と更新のための簡単な方法を公開するServiceを作成することをお勧めします。

最後に、「データダウン、アクションアップ」パターンに従うために、このコンポーネントでモデルを更新しないでください。代わりに、親コントローラ/コンポーネントにアクションを送信します。

app/components/employee-selector.js(あなたが書いているコンポーネント):

export default Ember.Component.extend({ 
    actions: { 
    updateId(id) { 
     Ember.$.post("http://server.ip.com/api/v1/getEmployee", { id: params.id }.then((response) => { 
     this.sendAction("select", response); 
    }); 
    } 
}); 

app/templates/new/it-request.hbs

{{employee-selector select=(action "selectEmployee")}} 

app/controllers/new/it-request.js

export default Ember.Controller.extend({ 
    actions: { 
    selectEmployee(employeeData) { 
     this.set("model.name", employeeData.name); 
     this.set("model.position", employeeData.name); 
    } 
    } 
}); 

旧答え:

ので、同様3210

慣用的な解決策はRouteでこれを行うことです。

まず、app/router.jsにルートを追加する必要がありますapp/employees/show/route.jsでルートを定義するより

this.route("employees", function() { 
    this.route("show", { path: ":id" }); 
} 

を:

import Ember from "ember"; 

export default Ember.Route.extend({ 
    model(params) { 
    return new Ember.RSVP.Promise((resolve, reject) { 
     Ember.$.post("http://server.ip.com/api/v1/getEmployee", { id: params.id }.then(
     (response) => { resolve(response) }, 
     reject 
    ); 
    }); 
    } 
}); 

(私は新しい約束のすべてを包んだ唯一の理由は、応答のカスタマイズを可能にすることです - resolve(response)を、サーバーからの生の応答を変換し、resolveをこの変換されたバージョンで呼び出すコードに置き換えてください)。

APIとのコミュニケーションが増えたら、ember-dataや他のデータレイヤライブラリ(おそらくOrbit)を使ってみることをお勧めします。

少なくとも、APIとのすべての通信を抽象化し、生のajaxリクエストを使用する任意の場所で使用するserviceを作成します。

+0

しかし、なぜ私はルートの従業員を作成する必要がありますか?私が望むのは、従業員情報の検索ボックスを持ったフォームを表示し、次に、より多くのフィールドを持つフォームを入力し続け、最後にその情報をサーバーに送信することです。これらのすべてはルートnew/it-requestを使用して – DeividKamui

+0

OK、申し訳ありませんが、私は誤解しました。この場合ComponentはOKですが、サービスにajaxロジックを抽出するかember-dataに切り替える必要があります。 – edziubudzik

+0

さらに、このコンポーネントはおそらくモデル自体を更新するべきではなく、新しい従業員データを含むアクションを送信して、親コンポーネント/コントローラがそれを処理し、それに応じてモデルを更新できるようにする必要があります。 – edziubudzik

0

私はここに、質問を誤解アップだ:

例BE

App.PressRoute = Ember.Route.extend({ 
    route: "press", 
    controllerName: 'press', 
    model: function(params) { 
     var controller = this.controllerFor("Press"); 

     if(controller.get("loaded") == false) { 
      controller.set("loaded",true); 
      return this.store.find('Article',{limit: 200}); 
     } 
     else return this.store.all('Article'); 
    }, 
    renderTemplate: function() { 
     this.render('press'); 
    } 
}); 
+0

これは問題ありませんか?私が理解する限り、すべてのAJAX呼び出しは、モデルによって行われなければならず、他の手段で行われる必要はありません。私はモデルの事と本当に混同しています。私はこれがemberjsがうまくいくかどうかは分かりません。私は、従業員のデータをajax経由でコンポーネントを使用して保存したいとしましょう。それを実行するのは大丈夫ですか、モデルを使用して行う必要がありますか? – DeividKamui

+0

モデルデータを保存する場合は、ストアメソッドを使用します ストアはFIND、ALLなどのさまざまな方法を提供します – Kejt

+0

ストアの問題は、すべてのバックエンドサービスが異なるサーバーにあることです。従業員データはhttp://sql.core.data/employeesという形式になります。従業員に関連する他のデータはhttp://webserver.apis.intranet/api/v1/getResourcesから取得できます。これは、各モデルアダプタとシリアライザは、いくつかのデータがソープ形式になる原因となります。通常はjqueryで遅延呼び出しを作成しましたが、emberjsでこの動作を作成する方法がわかりません – DeividKamui

0

これを行う方法はいくつかあります。

まず、EmberにはjQueryのaliasがあります。Ember.$です。したがって、使い慣れたjQueryの場合、これは十分に簡単であるはずです。

EmberのRSVPパッケージを使用することもできます。要求を行い、応答で何かを行う方法については、good example hereがあります。

第3に、ember-ajaxサービスが可能です。

しかし、Ember Dataには、(ajaxレスポンスのデータでモデルを更新する)ことが既に組み込まれています。アダプタとシリアライザのどちらかであなたのAPIをマップする必要があります。 Emberが期待しているサービスにサービスが変換されたら、query your server for a single recordを保存してください。

関連する問題