gpt4 book ai didi

javascript - Ember.js:对模型进行分组(使用 ArrayProxy)

转载 作者:行者123 更新时间:2023-12-02 20:38:49 24 4
gpt4 key购买 nike

我有一个数组,我想要对其项目进行分组,然后以这种分组方式显示。这一切都非常令人困惑:

App.GroupedThings = Ember.ArrayProxy.extend({
init: function(modelToStartWith) {
this.set('content', Ember.A());
this.itemsByGroup = {};

modelToStartWith.addArrayObserver(this, {
willChange: function(array, offset, removeCount, addCount) {},
didChange: function(array, offset, removeCount, addCount) {
if (addCount > 0)
// Sort the newly added items into groups
this.add(array.slice(offset, offset + addCount))
}
});
},

add : function(things) {
var this$ = this;

// Group all passed things by day
things.forEach(function(thing) {
var groupKey = thing.get('date').clone().hours(0).minutes(0).seconds(0);

// Create data structure for new groups
if (!this$.itemsByGroup[groupKey]) {
var newArray = Ember.A();
this$.itemsByGroup[groupKey] = newArray;
this$.get('content').pushObject({'date': groupKey, 'items': newArray});
}

// Add to correct group
this$.itemsByGroup[groupKey].pushObject(thing);
});
}
});


App.ThingsRoute = Ember.Route.extend({
model: function() {
return new App.GroupedThings(this.store.find('thing'));
},
});

只有当我使用以下模板时,这才有效:

{{#each model.content }}

这些不会渲染任何内容(使用 ArrayController):

{{#each model }}
{{#each content }}
{{#each}}
为什么? ArrayController 不应该代理“模型”(即 GroupedThings),而“模型”应该代理“内容”吗?

这成为一个问题的原因是我想对这些组进行排序,并且一旦我更改整个内容数组(即使使用 ArrayProxy.replaceContent()),整个 View 就会重建,即使只有一个项目添加到单个组中。

是否有完全不同的方法?

最佳答案

在做这些事情时,我倾向于以稍微不同的方式使用 ArrayProxies。我可能会让 Ember 完成所有繁重的工作,并且为了排序,让它根据内容集合创建 ArrayProxies,这样您就可以自动对它们进行排序:

(请注意,我尚未运行此代码,但它应该会插入您朝正确的方向前进)

App.GroupedThings = Em.ArrayProxy.extend({
groupKey: null,
sortKey: null,
groupedContent: function() {
var content = this.get('content');
var groupKey = this.get('groupKey');
var sortKey = this.get('sortKey');
var groupedArrayProxies = content.reduce(function(previousValue, item) {
// previousValue is the reduced value - ie the 'memo' or 'sum' if you will
var itemGroupKeyValue = item.get('groupKey');
currentArrayProxyForGroupKeyValue = previousValue.get(itemGroupKeyValue);
// if there is no Array Proxy set up for this item's groupKey value, create one
if(Em.isEmpty(currentArrayProxyForGroupKeyValue)) {
var newArrayProxy = Em.ArrayProxy.createWithMixins(Em.SortableMixin, {sortProperties: [sortKey], content: Em.A()});
previousValue.set(itemGroupKeyValue, newArrayProxy);
currentArrayProxyForGroupKeyValue = newArrayProxy;
}
currentArrayProxyForGroupKeyValue.get('content').addObject(item);
return previousValue;
}, Em.Object.create());
return groupedArrayProxies;
}.property('content', 'groupKey', 'sortKey')
);

然后您可以像这样创建一个 GroupedThings 实例:

var aGroupedThings = App.GroupedThings.create({content: someArrayOfItemsThatYouWantGroupedThatHaveBothSortKeyAndGroupKeyAttributes, sortKey: 'someSortKey', groupKey: 'someGroupKey'});

如果您想获取 groupedContent,只需获取实例并 get.('groupedContent')。简单的! :)

...它只会保持分组和排序(计算属性的力量)...如果您想要一个“添加”便捷方法,您可以在上面的 Em.Object.Extend def 中添加一个,但是您可以轻松地使用 Em.ArrayProxy 中的 native 代理,恕我直言,它们更好:

aGroupedThings.addObjects([some, set, of, objects]);

aGroupedThings.addObject(aSingleObject);

H2H

关于javascript - Ember.js:对模型进行分组(使用 ArrayProxy),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20434726/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com