我在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}}方法。
提前致谢。
答案 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;
}
});