Backbonejs集合具有reset a collection的批量更新功能。当我从服务器同步JSON数据时,我想在Titanium Alloy中使用此功能,但看起来好像没有提交/保存到SQLite - 我使用的是sql适配器。
config: {
columns: {
// stuff
name: "TEXT"
},
adapter: {
type: "sql",
collection_name: "pony",
db_name: Alloy.CFG.db_name
}
}
我有一些茉莉花测试一直在失败。仅供参考我有用于开发的迁移脚本,它可以为集合添加7个项目,以便我可以使用它。
describe("pony model", function () {
var Alloy = require("alloy")
data = {name: "My little pony"},
collection,
item;
beforeEach(function(){
collection = Alloy.createCollection('pony');
item = Alloy.createModel('pony');
});
// PASSES
it('can reset all data', function () {
collection.fetch();
expect(collection.length).toEqual(7);
collection.reset(data)
expect(collection.length).toEqual(1);
})
// FAILS
it('saves reset data', function () {
collection.fetch();
expect(collection.length).toEqual(7);
collection.reset(data)
collection.fetch()
expect(collection.length).toEqual(1);
})
afterEach(function () {
item.destroy();
});
})
这个bug在UI中显示的方式是,当我保存时,当我与服务器同步数据时,TableView显示新记录,然后当我转到另一个视图并返回到同一个TableView时,同步数据消失了替换为默认数据。
答案 0 :(得分:3)
我找到的最好的方法(我可耻地记不起我从哪里复制代码)是手动重置。我发布了代码来执行此操作:https://gist.github.com/sukima/8321859
基本上我自己创建SQL DELETE
然后使用Backbone reset()
,然后循环INSERT INTO
,最后完成主干trigger("fetch")
事件。通过主干的同步来实现这一目标是缓慢的。正常的reset()
无论如何都不会同步。
exports.definition = {
config: {
columns: {
// ...
},
adapter: {
type: "sql",
collection_name: "MyModels"
}
},
extendCollection: function(Collection) {
Collection.prototype.destroyAll = function(opt) {
var db = Ti.Database.open(this.config.adapter.db_name);
db.execute("DELETE FROM " + this.config.adapter.collection_name);
db.close();
this.models = [];
if (!opt || !opt.silent) { this.trigger("reset"); }
return this;
};
Collection.prototype.saveAll = function(opt) {
var util = require("alloy/sync/util");
var dbName = this.config.adapter.db_name;
var table = this.config.adapter.collection_name;
var columns = this.config.columns;
var db = Ti.Database.open(dbName);
db.execute("BEGIN;");
this.forEach(function (model) {
if (!model.id) {
model.id = util.guid();
model.attributes[model.idAttribute ] = model.id;
}
var names = [], values = [], q = [];
for (var k in columns) {
names.push(k);
values.push(model.get(k));
q.push("?");
}
var sqlInsert = "INSERT INTO " + table + " (" + names.join(",") + ") VALUES (" + q.join(",") + ");";
db.execute(sqlInsert, values);
});
db.execute("COMMIT;");
db.close();
if (!opt || !opt.silent) { this.trigger("reset"); }
return this;
};
Collection.prototype.refreshFromData = function refreshFromData(data) {
this.destroyAll({silent:true});
this.reset(data, {silent:true});
this.saveAll({silent: true});
this.trigger("fetch");
};
}
};