Javascript Enyo集合合并策略
以下是单击“更多”按钮后,我用来从服务提供商处获取更多照片的功能:Javascript Enyo集合合并策略,javascript,collections,enyo,Javascript,Collections,Enyo,以下是单击“更多”按钮后,我用来从服务提供商处获取更多照片的功能: showMore: function(){ this.$.resultList.collection.fetch({strategy:"merge",rpp:50}); } 这将调用集合中定义的fetch方法 fetch: function(opts) { this.params = { feature: this.methodType || "popular",
showMore: function(){
this.$.resultList.collection.fetch({strategy:"merge",rpp:50});
}
这将调用集合中定义的fetch方法
fetch: function(opts) {
this.params = {
feature: this.methodType || "popular",
image_size: 3,
sort: "created_at",
rpp: opts && opts.rpp || 25
};
return this.inherited(arguments);
},
这是工作正常,但问题是再次点击按钮,它应该获取另一组25张照片,并将其附加到我的收藏,但实际发生的是,有时,它只显示5张照片以及以前的照片
我对“合并”策略的理解是,如果接收到的记录与以前的记录相同,它将只获取与以前获取的记录不同的记录,并更新重复记录的主键。因此,我能够找出的一个原因是,它下次可能会获取25张照片,但由于大多数照片都与以前相同,因此它只显示与以前拍摄的照片不同的照片
如果我使用“添加”策略,它可以正常工作一次,也就是说,它会显示附加到集合中的另一组25张照片,其中大多数照片都是相同的。但是,如果再次单击“更多”按钮,则不会向集合中添加任何记录。不知道为什么会发生这种情况
如果我只想获取新照片并将其附加到收藏中,该如何处理。使用合并策略是正确的方法。您对合并的描述基本上是准确的,只是它不更新主键,而是更新具有相同主键的现有记录的数据 很难说为什么使用“添加”并不总是有效。如果记录没有主键(默认情况下为id),“添加”和“合并”应始终将记录添加到集合中(除非您使用的是合并键)。如果它们确实有主键,则可能是您试图添加重复记录,而Enyo将对此进行投诉并中止。检查控制台日志 如果没有代码,唯一的建议是设置断点并逐步执行enyo.Collection.merge 这是一个例子。如果您对设置id进行注释,则合并和添加策略将始终添加记录。如果注释掉合并策略,则在请求更多记录时,代码最终将出错
enyo.kind({
name: "ex.MockSource",
kind: "enyo.Source",
fetch: function(rec, opts) {
if(rec instanceof enyo.Model) {
rec.setObject(Faker.Helpers.createCard());
} else if (rec instanceof enyo.Collection) {
var count = opts && opts.count || 25;
var cards = [];
for(var i=0;i<count;i++) {
var card = Faker.Helpers.createCard();
// artificial id to force merges
card.id = enyo.now()%40;
cards.push(card);
}
opts.success(cards);
}
}
});
enyo.store.addSources({
mock: "ex.MockSource"
});
enyo.kind({
name: "ex.App",
kind: "Scroller",
bindings: [
{from: ".data", to: ".$.list.collection"},
{from: ".data.length", to: ".$.count.content", transform: function(v) {
return enyo.format("Displaying %s records", v);
}}
],
components: [
{name: "count"},
{name: "list", kind: "DataRepeater", components: [
{kind: "onyx.Item", components: [
{name: "name"},
{name: "phone"}
], bindings: [
{from: ".model.name", to: ".$.name.content"},
{from: ".model.phone", to: ".$.phone.content"}
]}
]},
{kind: "onyx.Button", content: "More", ontap: "moreTapped"}
],
create: enyo.inherit(function(sup) {
return function() {
sup.apply(this, arguments);
this.set("data", new enyo.Collection({
defaultSource: "mock"
}));
this.fetchRecords();
};
}),
fetchRecords: function() {
this.data.fetch({
count: 5,
strategy: "merge"
});
},
moreTapped: function() {
this.fetchRecords();
}
});
new ex.App().renderInto(document.body);
enyo.kind({
名称:“ex.MockSource”,
种类:“enyo.来源”,
fetch:函数(rec、opts){
if(enyo.Model的记录实例){
rec.setObject(Faker.Helpers.createCard());
}else if(enyo.Collection的记录实例){
var count=opts&&opts.count | | 25;
var卡=[];
对于(var i=0;i