我目前正在努力使用Arraycontroller和它的模型。如果商店中的数据发生变化,它根本不会改变。特别是如果将记录附加到商店,我希望处理这些条目的数组控制器与商店一起更新。我认为有一些数据绑定,但它似乎根本不是这样。
我们说我有这条路线:/#/institute/10/user-administration
学院模型看起来像
App.Institute = DS.Model.extend({
name: DS.attr('string'),
users: DS.hasMany('user', {async:true})
});
这就是我如何设置Arraycontroller的模型:
App.UserAdministrationRoute = Ember.Route.extend({
model : function() {
// get users from the current institute
return this.modelFor('institute').get("users").then(function(users) {
return users.filter(function(item, index, enumerable){
// filter anonymous dummy users
return item.get('name') != "~dummy~";
});
});
}
});
在UserAdministration-Controller中我做了
App.UserAdministrationController = Ember.ArrayController.extend({
needs: ['institute'],
actions : {
createNewUser : function() {
var newUser = this.store.createRecord('User', {
role : 0
});
this.transitionToRoute('user-administration.edit', newUser);
}
}
});
在路线user-administration.edit
中,我使用this.get('model').save();
但ArrayController没有使用商店中刚刚创建和保存的新记录进行更新。
我想如果我将控制器模型挂钩到filter
上可能有一种方法,但我如何定义一个过滤器来定义ArrayController的模型。
感谢您提供任何帮助。
答案 0 :(得分:0)
由于绑定是异步的,我认为你需要明确设置关联(参见https://github.com/emberjs/data/issues/1532)。
App.UserAdministrationController = Ember.ArrayController.extend({
needs: ['institute'],
actions : {
createNewUser : function() {
var newUser = this.store.createRecord('User', {
role : 0
});
// NEW
this.get('controllers.institute.model.users').then(function(users) {
users.addObject(newUser);
});
// END NEW
this.transitionToRoute('user-administration.edit', newUser);
}
}
});
答案 1 :(得分:0)
在考虑了一点并考虑this question之后,我可以自己解决这个问题。 ArrayController实际上并没有真正绑定到商店,因为我没有将store.filter设置为模型。
为了实现Arraycontroller始终与商店的数据同步,我必须将过滤器定义为模型。我的路线中的模型现在看起来像这样,就像一个魅力!
App.UserAdministrationRoute = Ember.Route.extend({
model : function() {
var scope = this;
return this.modelFor('institute').get("users").then(function(){
return scope.store.filter('user', function(user){
return user.get('name') != "~dummy~";
});
});
}
});
过滤和查询数据之间存在巨大差异,我只需要意识到:SHOULD I USE A QUERY OR A FILTER TO SEARCH RECORDS?