如何重置钛合金系列?

时间:2013-10-21 09:42:29

标签: jasmine titanium-mobile titanium-alloy

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时,同步数据消失了替换为默认数据。

1 个答案:

答案 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");
    };

  }

};