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;
    }
});

例如,当我转到 index 以外http://app.tld/#/property/1的路线时,路线会被重写为http://app.tld/#/property/undefined. 没有任何东西被传递给content属性控制器的属性。如何在find()方法中进行异步调用?除非我弄错了,否则异步调用在findAll()方法中可以正常工作,这是我困惑的根源。

这个问题类似于Deserialize with an async callback,但我使用的是该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 回答