Enyo集合合并策略
Enyo Collection Merge Strategy
下面是我在点击更多按钮时从服务提供商获取更多照片的函数:
showMore: function(){
this.$.resultList.collection.fetch({strategy:"merge",rpp:50});
}
这将调用collection中定义的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张照片附加到集合中,其中大多数是相同的。但是,如果再次单击更多按钮,则没有记录被添加到集合中。不知道为什么会这样。
如果我想只获取新照片并将其附加到集合中,我应该如何处理
使用合并策略是正确的方法。你对merge的描述基本上是准确的,除了它不更新主键,而是用相同的主键更新现有记录的数据。
很难说为什么使用"add"并不总是有效。如果记录没有主键(默认是id),"add"answers"merge"应该总是将记录添加到集合中(除非您使用了mergeKeys)。如果它们确实有一个主键,你可能会尝试添加重复的记录,而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);
相关文章:
- JQuery合并了keyup和focusout两个函数
- JSON重构(合并内容)与javascript
- Javascript-根据赋值顺序,按键合并对象数组
- 合并两个数组,重新调整循环js
- 内容安全策略:页面's设置阻止加载资源
- 如何合并不同集合的游标并按日期排序
- 合并TinyMCE(jQuery插件)文件
- 如何循环通过2个对象数组并通过匹配id进行合并
- 将两个Json提要合并为一个,并按时间排序
- 导致内容安全策略(CSP)冲突错误的本地jquery.js文件
- 将项目履行与高级模板合并,并通过电子邮件发送至Netsuite 2.0
- DataTables合并了两个独立表中的jQuery/Javascript函数
- 承诺合并流
- 如何使用javascript合并两个对象数组
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 可以合并或嵌套ES6导入
- 在rxjs中巧妙的蒸汽可观察合并
- mandrill合并标记不接受变量值
- 旋转木马;启用内容安全策略时无法工作
- Enyo集合合并策略