Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 在路由中合并两个模型阵列_Ember.js_Ember Data - Fatal编程技术网

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数据实现此功能,但它不再有效:(