6

プロパティモデルにメソッドを実装find()しました。findAll()どちらのメソッドも、APIを非同期で呼び出します。 findAll()私のホームルートのアウトレットを接続しているときに呼び出され、正常に動作します。 find()私のプロパティルートのアウトレットを接続しているときにEmber.jsによって呼び出されます。find()これは、アクションを介してプロパティルートに移動するときに呼び出されるのではなく、URLを介してルートに直接移動するときに呼び出されることに注意してください。

これが私のルーターです:

App.Router = Ember.Router.extend({
    root: Ember.Route.extend({
        showProperty: Ember.Route.transitionTo('property'),
        home: Ember.Route.extend({
            route: '/',
            connectOutlets: function(router) {
                router.get('applicationController').connectOutlet('home', App.Property.findAll());
            }        
        }),
        property: Ember.Route.extend({
            route: '/property/:property_id',
            connectOutlets: function(router, property) {
                router.get('applicationController').connectOutlet('property', property);
            }
        }),
    })
});

そして、ここに私の方法findAll()find()方法があります:

App.Property.reopenClass({
    find: function(id) {
        var property = {};
        $.getJSON('/api/v1/property/' + id, function(data) {
            property = App.Property.create(data.property);
        });
        return property;
    },
    findAll: function() {
        var properties = [];
        $.getJSON('/api/v1/properties', function(data) {
            data.properties.forEach(function(item) {
                properties.pushObject(App.Property.create(item));
            });
        });
        return properties;
    }
});

たとえば、インデックス以外のルートに移動するとhttp://app.tld/#/property/1、ルートはに書き換えられhttp://app.tld/#/property/undefinedます。contentプロパティコントローラーのプロパティには何も渡されていません。find()メソッドで非同期呼び出しを行うにはどうすればよいですか?私が間違っていない限り、非同期呼び出しはfindAll()メソッドで正常に機能します。これが私の混乱の原因です。

この質問は、非同期コールバックを使用したDeserializeに似ていますが、メソッドfind()をオーバーライドする代わりにメソッドを使用していますdeserialize()

前もって感謝します。

4

2 に答える 2

8

I found that setting the id property explicitly solves this problem. In your case this would look like this.

find: function(id) {
  var user = App.User.create();

  $.getJSON('/api/v1/property/' + id, function(data) {
    user.setProperties(data.user)
  });

  user.set("id",id); // <-- THIS

  return user;
}

Once your user gets its properties set the view updates as normal. Ember just need the id part before in order to update the URL.

Hope this helps :-)

于 2012-09-08T05:21:23.513 に答える
0

これがあなたがやりたいことです。少しわかりやすくするために、モデルをUserに変更しました。

の場合find()、AJAXリクエストが戻ってきたときにプロパティが入力される空白のモデルインスタンスを返します。Emberのデータバインディングの良いところは、このモデルをビューにすぐに表示でき、AJAXリクエストが戻ってモデルインスタンスを更新するとビューが更新されることです。

の場合findAll()、AJAXリクエストが戻ってきたときに埋められる空白の配列を返します。と同じようにfind()、このモデルのリスト(最初は空白になります)をビューに表示できます。AJAXリクエストが返され、配列に入力されると、ビューが更新されます。

App.User.reopenClass({

  find: function(id) {
    var user = App.User.create();

    $.getJSON('/api/v1/property/' + id, function(data) {
      user.setProperties(data.user)
    });

    return user;
  },

  findAll: function() {
    var userList = [];

    $.getJSON('/api/v1/properties', function(data) {
      var users = data.users.map(function(userData) {
        return App.User.create(userData);
      });
      userList.pushObjects(users);
    });

    return userList;
  }

});
于 2012-08-25T16:05:40.090 に答える