要点:
控制器计算属性问题:在一种情况下,我可以看到所有添加的内容但没有立即看到新添加的内容(jsbin),在另一种情况下,我可以立即看到新添加的内容但是之前添加的内容未显示(jsbin)。
8月26日的第二次更新:
所以我在想...我有两个互补的代码片段。我只需要将它们结合起来并实现完美,对吧?可悲的是,它失败了,就像你can see in this jsbin一样,没有任何表现。 :(
这是我的失败的尝试合并两个RecordArrays:
officelist: function(){
var allrecords = [];
console.log("in oficelist");
// get the record array that shows previously added records
var a_recordarray = App.Office.find({org_id: 'myorgid'});
a_recordarray.forEach(function(record){
allrecords.push(record);
});
console.log(a_recordarray.toString());
console.log(allrecords.length);
// get the record array that shows newly added records
var b_recordarray = App.Office.filter(function(office) {
return office.get('org_id') === 'myorgid';
});
b_recordarray.forEach(function(record){
allrecords.push(record);
});
console.log(b_recordarray.toString());
console.log(allrecords.length);
// return the combination
return allrecords;
}.property('content.@each')
详细说明:
我有这个simple jsbin app在代码中使用控制器计算属性来显示要显示的名称列表。问题是,无论何时添加新名称,您都必须刷新页面才能看到它的显示。
您可以看到code here。
具有计算属性的控制器代码:
officelist: function(){
return App.Office.find({org_id: 'myorgid'});
}.property('content.@each')
路线返回不同的模型:
App.OrganizationRoute = Ember.Route.extend({
model: function() {
return App.Org.find();
}
});
车把:
{{#each officelist}}
<li>{{officename}} </li>
{{/each}}
约束:我确实需要'org_id'存在,我确实需要让路径模型从显示的模型中返回不同的模型。
8月26日更新: Jonathan has made some progress但请注意我对他的回答的评论,因为它没有完全解决问题。
8月24日更新:增加了要显示的数据与路由器模型中返回的数据不同的复杂性。 (还将ArrayController更改为ObjectController,但由于ObjectController还具有content
属性,因此此更改没有任何后果。),下面是旧的东西:
<击> 具有计算属性的控制器代码:
officelist: function(){
return App.Office.find({org_id: 'myorgid'});
}.property('office.@each')
车把:
{{#each officelist}}
<li>{{officename}} </li>
{{/each}}
击> <击> 撞击>
答案 0 :(得分:1)
问题是计算属性是缓存的,只会在office.@each
更改时刷新。 {1}}属性未在该控制器上定义,因此office
始终为null。可能你想要的是office.@each
。所以:
content.@each
现在,只要添加新办公室,页面就会刷新。
答案 1 :(得分:1)
将App.OrganizationController的行政财产更改为:
officelist: function() {
return App.Office.filter(function(office) {
return office.get('org_id') === 'myorgid';
});
}.property()
原因是调用App.Office.find()
尝试从适配器中获取(在您的情况下为localStorage)。你要做的只是把它拉出商店。为此,App.Office.filter()
(在其他情况下,App.Office.all()
)是您的朋友。
<强>更新强>
要同时获取之前保存的其他办公室,请使用find()获取它们。你可能会这样做的地方是控制器在路由的setupController
挂钩中初始化。
App.OrganizationRoute = Ember.Route.extend({
model: function() {
return App.Org.find();
},
setupController: function(controller, model) {
this._super.apply(this, arguments);
App.Office.find({org_id: 'myorgid'});
}
});
您不必担心存储结果,因为任何生成的Office记录都会加载到商店中,您的App.Office.all()
和App.Office.filter()
来电将自动获得更新。
答案 2 :(得分:1)
如果您未使用find
参数进行org_id
调用,则一切正常:
officelist: function(){
return App.Office.find();
}.property('content.@each')