4

Ember-DataのRESTアダプターに適さないAPIがあります。約3つのモデルがあるため、jQueryの古い$.ajaxを使用することにしました。モデルを取得して正しい方法でコントローラーに渡す方法を見つけている間、私は頭を悩ませました。

ガイドからの次の例を検討してください。

App.Router.map(function(match) {
  match('/posts').to('posts');
});

App.PostsRoute = Ember.Route.extend({
  model: function() {
    return App.Post.findAll(); // Just renamed to .findAll.
  }
});

.findAllメソッドはE.ArrayProxyのインスタンスを返す必要があることがわかりました。そうでない場合、次のようなことはできません。

{{#if content}}
  ...
{{else}}
  <strong>Nothing to display</strong>
{{/if}}

そして私の実装はそう見えます:

App.Post.reopenClass({
  findAll: function() {
    var result = Ember.ArrayProxy.create({content: []});

    $.getJSON('/posts', function(data) {
      $.each(data, function(i, row) {
        result.pushObject(App.Post.create(row));
      });
    });

    return result;
  }
});

私はこれにかなり満足していますが、単一のオブジェクトを操作する方法を想像することはできません。

App.PostsRoute = Ember.Route.extend({
  model: function(params) {
    return App.Post.find(params.post_id);
  }
});

// This will not work for me. Controller's content property will alway be null.
App.Post.reopenClass({
  find: function(postId) {
    var result = null;

    $.getJSON('/' + postId, function(data) {
      result = App.Post.create(data);
    });

    return result;
  }
});

解決策は何ですか?

空のコンテンツを含むダミーのEmber.ObjectProxyインスタンスを返し、コンテンツに実際にオブジェクトが入力された後、どういうわけかEmberに通知する必要がありますか?ゴールデンパスとは何ですか?

4

1 に答える 1

13

基本的にember-dataが行う方法である、プレーンで古いオブジェクトだけを使用できます。

App.Post.reopenClass({
  find: function(postId) {
    // Set some default properties here.
    var result = Ember.Object.create({
      isLoaded: false
    });

    $.getJSON('/' + postId, function(data) {
      result.setProperties(data);
      result.set('isLoaded', true);
    });

    return result;
  }
});

これは黄金の道ですか?おそらくそうではありませんが、Emberに飛び込むほど、ember-dataによって約束された豊富な機能セットが必要になります。数ヶ月前、私は自分のフレームワークを書きました。ember-dataと比較するとひどいですが、ルート要素、サイドロードされたデータ、下線付きの名前、サポートされている埋め込み関係は必要ありませんでした。ember-dataが成熟するにつれてこれらに対処することを期待しており、アダプターとシリアライザーの交換を容易にするために懸命に取り組んできたと思います。

于 2013-01-04T18:12:36.023 に答える