Ember.js 在路由中合并两个模型阵列
我有一个控制器处理模型列表。这些模型有两种不同的类型(例如Ember.js 在路由中合并两个模型阵列,ember.js,ember-data,Ember.js,Ember Data,我有一个控制器处理模型列表。这些模型有两种不同的类型(例如消息和评论)。为了使用ArrayController,我必须将两个列表合并为一个列表。有办法做到这一点吗 基于类的多态性可以解决我的问题,但它们不太可能很快实现 在我当前的解决方案中,我使用ObjectController来显示注释和消息。然后,我使用计算属性合并它们: App.SomeRoute = Ember.Route.extend({ model: function (params) { return Em.Objec
消息
和评论
)。为了使用ArrayController
,我必须将两个列表合并为一个列表。有办法做到这一点吗
基于类的多态性可以解决我的问题,但它们不太可能很快实现
在我当前的解决方案中,我使用ObjectController
来显示注释
和消息
。然后,我使用计算属性合并它们:
App.SomeRoute = Ember.Route.extend({
model: function (params) {
return Em.Object.create({
comments: this.store.find('comment'),
messages: this.store.find('message'),
});
},
});
App.SomeIndexController = Ember.ObjectController.extend({
merged: Em.computed.union('messages', 'comments'),
});
它可以工作,但我并没有从ArrayController
的所有细节中获益(比如sortProperties
)
我想做的是:
App.SomeRoute = Ember.Route.extend({
model: function (params) {
var comments = this.store.find('comment');
var messages = this.store.find('message');
return merge(comments, messages);
},
});
其中,
merge
返回的内容与this.store.find('model')返回的内容类似
最近我问了一个类似的问题,下面是我如何解决这个问题的
App.SomeIndexController = Ember.ObjectController.extend({
sortProperties: ['some field'],
sortAscending: false, // false for descending
merged: function() {
var comments = this.get('comment') || [], // This gets wherever you've stored the comments array
messages = this.get('message') || [];// This gets wherever you've stored the messages array
var stream = Ember.A();
stream.pushObjects(comments.toArray());
stream.pushObjects(messages.toArray());
return Em.ArrayProxy.createWithMixins(Ember.SortableMixin, {
content: stream,
sortProperties: this.sortProperties,
sortAscending: this.sortAscending
});
}.property('messages.@each', 'comments.@each')
});
希望这对你也有用。仅供参考,例如,我的控制器实际上是渲染的控制器,因此我不在路线中为其设置模型。我只是在我的控制器上有一些属性,比如说,commments
和messages
,它们不断地更新为记录数组
因此,对于您的示例,您可能需要观察
.property('model.messages.@each','model.comments.@each')
受@bmeyers答案的启发,在探索了一点ember数据的源代码之后,我提出了一个可重用且不太糟糕的解决方案。它可能不是最优的,但它确实起到了作用
App.Store = DS.Store.extend({
findMultiple: function (types) {
var self = this;
var recordsByType = types.map(function (type) {
return self.find(type);
});
return self.mergeArrayPromises(recordsByType);
},
mergeArrayPromises: function (promises) {
var promise = Ember.RSVP.all(promises).then(function(arrays) {
var mergedArray = Ember.A();
arrays.forEach(function (records) {
mergedArray.pushObjects(records.toArray());
});
return mergedArray;
});
return DS.PromiseArray.create({
promise: promise,
});
},
});
App.SomeRoute = Ember.Route.extend({
model: function (params) {
return this.store.findMultiple(['comment', 'message']);
},
});
这可能会有帮助。不久前我偶然发现了这一点,你的问题提醒了我
没问题,我认为最好创建某种可以合并记录数组的mixin,或者框架中的其他插件。如果您遇到任何更好的方法,请告诉我,我将努力创建一些,这样就不会每次都需要所有这些代码。我添加了一个可能对您有用的答案。太棒了!我将在我自己的应用程序中试用。谢谢你,伙计。您是否发现需要继续重新蚀刻阵列,还是阵列会自动更新?这是一个好问题。我认为它不会自动更新。你必须试一试;)不幸的是,我尝试用最新版本的ember和Emer数据实现此功能,但它不再有效:(