【问题标题】:Populate backbone collection inside backbone sync在骨干同步中填充骨干集合
【发布时间】:2014-01-28 15:33:01
【问题描述】:

如何在主干同步中填充主干集合,以便在主干同步之外使用生成的集合。

这是一个例子:

mycollection = new MyCollection();
mycollection.fetch();

// after a few seconds ... it triggers the success function

mycollection.length; //prints 0 :S

这是我的主干同步代码:

define(["backbone"], function (bb) {
        bb.sync = function (method, model, options) {

            var sql = "";

            if (!model.tabla) {
                if (options && options.error)
                    options.error("No property 'tabla' for model");
            }

            switch (method) {
                case 'create':
                    break;
                case 'update':
                    break;
                case 'delete':
                    break;
                case 'read':
                    sql = "select * from " + model.tabla;
                    break;
            }

            console.log("MODELO", model);

            if (app.db == undefined) return;

            app.db.transaction(function (tx) {
                tx.executeSql(sql, [], function (tx, res) {
                        var resp = [];
                        for (var i = 0; i < res.rows.length; i++) {
                            resp.push(res.rows.item(i));
                        }

                        if (options && options.success) options.success(resp);
                    }
                );
            }, function (e) {
                console.log(e);

                if (options && options.error) options.error(e);
            });
        }
    }
);

我的问题是输入模型没有被结果数组修改。我该怎么做?

【问题讨论】:

  • 我不确定我是否完全按照您在此处尝试完成的操作。我是否正确,您希望与浏览器本地存储而不是外部服务器进行交互?如果是这种情况,请查看 Backbone.localstorage 扩展 documentup.com/jeromegn/backbone.localStorage
  • @JonathanW 似乎您以正确的方式进行操作。我用覆盖Backbone.sync 方法的简单示例创建了jsfiddle,该方法很好地修改了外部集合。 jsfiddle.net/gEBfV主要功能是调用options.success(resp);

标签: javascript backbone.js


【解决方案1】:

由于您的情况是异步调用,因此只有在成功回调后才能使用新的收集数据。

你可以使用

mycollection.fetch().then(function() {
    console.log(mycollection.length);
});

或者

mycollection.fetch({
    success: function() {
        console.log(mycollection.length);
    }
});

甚至

mycollection.on("fetch-complete", function() {
    console.log(mycollection.length);
});

mycollection.fetch({
    success: function(collection) {
        collection.trigger("fetch-complete");
    }
});

【讨论】: