12

次の残り火データモデルがあるとします。

App.Person = DS.Model.extend({
    firstName: DS.attr('string'),
    lastName:  DS.attr('string'),
    starred:   DS.attr('boolean')
});

これは、次のかなり標準的なCRUDAPIを使用してRailsアプリと通信します。

GET    /people    - get a list of people
POST   /people    - create a new person
GET    /people/id - get a specific person
PUT    /people/id - update a specific person
DELETE /people/id - delete a specific person

これはすべて、標準のStore/Adapterを使用してEmber-Dataにマップされます。

ただし、人を「スター」または「スター解除」するために、APIでは標準の更新アクションではこれを実行できないとしましょう。このアクションには特定のAPIエンドポイントがあります。

POST   /people/id/star   - mark a person as "starred"
POST   /people/id/unstar - mark a person as "unstarred"

このAPIをEmberDataに適合させるにはどうすればよいですか?

どういうわけかDS.StoreとDS.RESTAdapterを拡張する必要があるようですが、これらのさまざまなアクションを認識させるための最善の方法がわかりません。また、アプリの汎用アダプターが主演者を認識している必要があることも少し間違っていると感じています。

POST /people/id私はAPIを制御できないため、標準の更新に適合するように「スター付け」を認識できないことに注意してください。

4

5 に答える 5

10

しばらく経ちましたが、当時は不可能だったかもしれませんが、アダプターのajaxメソッドを直接呼び出すことができます。

YourApp.Store.prototype.adapter.ajax(url, action, {data: hashOfParams})

例えば:

YourApp.Store.prototype.adapter.ajax('/products', 'GET', {data: {ids: [1,2,3]}})

あなたの質問のために:

YourApp.Store.prototype.adapter.ajax('/people' + id + '/star','POST')

編集-buildURLを使用すると、特にアダプターに名前空間を設定した場合に便利です。

url = YourApp.Store.prototype.adapter.buildURL('people',id) + '/star'

編集2-でアダプターを入手することもできますcontainer.lookup('adapter:application')。これは、アプリへのグローバルアクセスがない場合に便利です(例:ES6モジュール/ ember-cli)

編集3-上記はEmber/Ember-CLIの古いバージョンを参照しています。今、私はこの関数をミックスインで定義します-

  customAjax: (method, type, id, action, hash = null) ->
    #note that you can now also get the adapter from the store -
    #adapter = @store.adapterFor('application')
    adapter = @container.lookup('adapter:application')
    url = adapter.buildURL(type, id) + '/' + action
    hash['data'] = $.extend({}, hash) if hash #because rails
    adapter.ajax(url, method, hash).then (result) =>
      return result

そしてそれをそのように呼ぶ-

@customAjax('PUT', 'modelClass', modelId, 'nonCRUDActionName', optionalHashOfAdditionalData).then (response) =>
  #do something with response
于 2014-04-13T18:04:38.143 に答える
2

私は同じ問題を経験し、ここで説明されているものの修正バージョンを使用してそれを解決しました: Ember.jsの非クラッドレールアクション

基本的に、Jquery AJAX呼び出しを使用する必要があります。私にとって重要な部分は、フォームデータ(データを含める場合のデフォルト)ではなく、リクエストヘッダーで送信される認証データを取得するためにcontentTypeを変更することでした。あなたの電話で)。また、AJAX部分で適切なコンテキストを指定するようにしてください。そうしないと、「this」は「success」コールバックで機能しません。

App.ItemController = Ember.ObjectController.extend
    actions:
        starItem: ->
            controller = this
            item = @get 'model'
            id = item.id
            token = @auth.get 'authToken'
            $.ajax
                type: 'PUT'
                context: controller
                data: '{ "auth_token": "' + token + '"}'
                url: '/api/v1/items/' + id + '/star'
                contentType: 'application/json; charset=UTF-8'
                dataType: 'json'
                success: ->
                    if @get 'item.starred_by_user'
                        @set 'model.starred_by_user', false
                        item.decrementProperty('total_stars') 
                    else 
                        @set 'model.starred_by_user', true
                        item.incrementProperty('total_stars')
于 2014-03-25T09:42:58.377 に答える
0

CQRSでは、サームのスターとアンスターがコマンドだと思います。したがって、モデルPersonStarを宣言し、それを使用する必要があります。

于 2013-03-15T04:20:19.790 に答える
0

たぶん良いスタートです:https ://github.com/beautifulnode/ember.request

まだ試していませんが、あなたの場合は有望なようです...

于 2012-03-14T16:40:40.407 に答える
-1

ディスカッショングループで、イェフダはこれはまだ不可能だと述べました。

于 2012-03-18T01:15:15.113 に答える