Ember.js - 模型find()方法中的异步调用

时间:2012-08-21 22:40:24

标签: javascript ember.js

我在Property模型上实现了find()findAll()方法。这两种方法都对API进行异步调用。在为我的家庭路线连接插座时调用findAll(),并且工作正常。在连接我的物业路线的出口时,Ember.js会调用find()。请注意,在通过操作导航到属性路径时不会调用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。没有任何内容传递给Property控制器的find()属性。如何在findAll()方法中进行异步调用?除非我弄错了,异步调用在find()方法中工作正常,这是我混淆的原因。

此问题与Deserialize with an async callback类似,但我使用的是deserialize()方法,而不是覆盖{{1}}方法。

提前致谢。

2 个答案:

答案 0 :(得分:8)

我发现设置id属性明确解决了这个问题。在你的情况下,这将是这样的。

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

一旦您的user获取其属性,视图就会正常更新。 Ember之前只需要id部分即可更新网址。

希望这会有所帮助: - )

答案 1 :(得分: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;
  }

});