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

bir*_*ric 6 javascript ember.js

我已经实现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);
            }
        }),
    })
});
Run Code Online (Sandbox Code Playgroud)

以下是我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;
    }
});
Run Code Online (Sandbox Code Playgroud)

例如http://app.tld/#/property/1,当我转到索引以外的路径时,路径会被重写为http://app.tld/#/property/undefined.没有任何内容传递给contentProperty控制器的属性.如何在find()方法中进行异步调用?除非我弄错了,异步调用在findAll()方法中运行良好,这是我混淆的根源.

这个问题类似于使用异步回调反序列化,但我使用的是find()方法而不是覆盖deserialize()方法.

提前致谢.

小智 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;
}
Run Code Online (Sandbox Code Playgroud)

一旦你user得到它的属性设置视图更新为正常.Ember只需要id之前的部分就可以更新URL.

希望这可以帮助 :-)