Backbone:集合为自己添加随机模型

时间:2015-01-19 17:27:17

标签: javascript backbone.js

我一直在搜索StackOverflow来回答我的问题,但还没有得到一些有用的东西。

关于如何设置集合对象的一些背景知识。在获取时,我将集合传递给哈希,并将URL设置为http://localhost/index.php?a=hash。服务器应返回该特定哈希的12个名称。

由于某种原因,集合的第一个模型总是一个模型,其属性设置为用于获取集合数据的字符串,之后的每个模型都非常精细。

fetch : function(o) {
        var that = this,
            successCallback = o.success,
            errorCallback   = o.error;
        $.ajax({
            type : 'GET',
            url  : this.url + o.hash,
            dataType : 'json',
            success : function(data) {
                _.each(data, function(name) {
                    console.log(name);
                    that.add(new Model({
                        _id : name
                    }));
                });
                successCallback();
            },
            error : errorCallback
        });
    }

记录的名称列表是我期望从服务器[aaa,bbb,ccc,ddd ...]获得的12个名称。当我使用集合渲染视图时,这就是我所拥有的:

Object { cid="c1", attributes={...}, collection={...}, more...
Object { cid="c2", attributes={...}, _changing=false, more...}
Object { cid="c3", attributes={...}, _changing=false, more...}
Object { cid="c4", attributes={...}, _changing=false, more...}
Object { cid="c5", attributes={...}, _changing=false, more...}
Object { cid="c6", attributes={...}, _changing=false, more...}
Object { cid="c7", attributes={...}, _changing=false, more...}
Object { cid="c8", attributes={...}, _changing=false, more...}
Object { cid="c9", attributes={...}, _changing=false, more...}
Object { cid="c10", attributes={...}, _changing=false, more...}
Object { cid="c11", attributes={...}, _changing=false, more...}
Object { cid="c12", attributes={...}, _changing=false, more...}
Object { cid="c13", attributes={...}, _changing=false, more...}

正确的模型看起来像这样:http://i.stack.imgur.com/2Fprv.png

该集合的第一个模型是:http://i.stack.imgur.com/5eGdB.png

看起来我的集合的第一个模型具有attributes属性,其初始哈希用于获取实际数据。我不知道它是如何设置这个,或者在哪里。以下是我参考集合模型的方法:

render : function() {
        _.each(this.collection.models, function(model) {
            console.log(model);
            var ele = this._build(model.id),
                a   = ele.find('a');

            this.$el.append(ele);
            a.click(App.pageController.trigger('showSetData', model.id));
        }.bind(this));
    }

我可以进入并删除该集合的第一个模型,但我想知道为什么会发生这种情况,如果有更好的解决方法而不是黑客攻击。如果您需要任何其他信息,请告诉我们!感谢。

收集代码

初始化

var col = new ClientSetList(hash);

ClientSetList Backbone.Collection代码

var ClientSetList = Backbone.Collection.extend({
    initialize : function(hash) {
        this.url = App.config.host +
                   App.config.base +
                   App.config.HASH + hash;
    },

    fetch : function(o) {
        var that = this,
            successCallback = o.success,
            errorCallback   = o.error;
        $.ajax({
            type : 'GET',
            url  : this.url,
            dataType : 'json',
            success : function(data) {
                _.each(data, function(setName) {
                    console.log(setName);
                    that.add(new Model({
                        set_name : setName
                    }));
                });
                successCallback();
            },
            error : errorCallback
        });
    }
});

1 个答案:

答案 0 :(得分:1)

初始化Collection时的第一个参数是模型列表,第二个参数是选项哈希,与使用第一个参数作为选项的视图和模型不同。您所描述的内容与初始化集合时省略空数组时发生的情况一致。

您可以在初始化集合的位置发布代码吗?

我认为你有:

var opt = {
    //... options
}
var c = new Backbone.Collection(opt);

你应该拥有什么:

var opt = {
    //... options
}
var c = new Backbone.Collection([], opt);