用Backbone.js设置我的模型

Setting my model with Backbone.js

本文关键字:我的 模型 设置 js Backbone      更新时间:2023-09-26

我正在尝试使用Backbone.js来简化数据(JSON)管理和与DOM的交互。

首先,我不确定Backbone.js是否真的可以简化和改进当前的流程,但我认为它可以。

以前我使用jQueryAJAX函数检索数据。现在,我正在将数据(仍然使用AJAX)Backbone样式检索到Backbone模型中。

对于更新,之前我通过JSON对象本身进行解析来更新数据。然后,我会将更新后的json发送回后端(就像我收到它一样)。

现在,是否可以使用Backbone中的set函数来简化以下内容,理想情况下应该在哪里构建set属性行为(以及所有其他UI绑定,如更改事件)?它会出现在视图初始值设定项中的fetch()成功处理程序上吗?

function setBucketOffer(bucketName, newId) {
    var segments = json.segments;
    for (var i = 0; i < segments.length; i++) {
        if (segments[i].market.toLowerCase() === g_market) {
            var genders = segments[i].gender;
            for (var i = 0; i < genders.length; i++) {
                if (genders[i].name.toLowerCase() === g_segment) {
                    var buckets = genders[i].buckets;
                    for (var i = 0; i < buckets.length; i++) {
                        if (buckets[i].name === bucketName) {
                            buckets[i].confirm = newId;
                            return;
                        }
                    }
                }
            }
        }
    }
}

示例JSON

{
    "segments": [
        {
            "market": "Market1",
            "gender": [
                {
                    "name": "male",
                    "buckets": [
                        {
                            "name": "Market1_M_CBD",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": ""
                        },
                        {
                            "name": "Market1_M_North",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": ""
                        }
                    ]
                },
                {
                    "name": "female",
                    "buckets": [
                        {
                            "name": "Market1_F_CBD",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": "10054"
                        }
                    ]
                }
            ]
        },
        {
            "market": "Market2",
            "gender": [
                {
                    "name": "male",
                    "buckets": [
                        {
                            "name": "Market2_M_CBD",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": "10054"
                        },
                        {
                            "name": "Market2_M_North",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": "10054"
                        },
                        {
                            "name": "Market2_M_South",
                            "subscribers": "50,000",
                            "postcode": "20000-2010",
                            "lastsend": "13/03/12 4:30PM",
                            "suggest": "10054",
                            "confirm": "10054"
                        }
                    ]
                }
            ]
        }
    ]
}

编辑1

从这里开始,我试图充分利用Parse,并从我的JSON:中获取片段

var Offers = Backbone.Collection.extend({
    url: 'URL',
    parse: function (response) {
        return response.segments;
    }
});

在这里,我得到的不仅仅是response.segments。我也不确定使用render函数或fetchsuccess函数来填充DOM是否正确。假设我在DOM中有我的html模板。。。我想使用jQueryclone()来克隆它,并在分段上使用forEach来填充克隆,并将所有克隆推回到html主体中。这在骨气上可行吗?你会怎么做?(我可以在没有backbone.js的情况下做到这一点,但我想看看如何使用backbone.jsp进行改进,并将克隆上的所有数据绑定到模型更改中)

var OfferView = Backbone.View.extend({
    initialize: function () {
        this.model = new Offers();
        this.model.fetch({
            success: function (collection, response) {
                console.log(response);
            }
        });
        this.model.on('change', this.modelChange);
        this.model.on('change', this.render);
        this.modelChange = function () {
            alert('model changed');
        };
    },
    render: function () {
    }
});

编辑2

我可以通过forEach创建单独的视图,但在将这些视图插入DOM时遇到了问题。我做错了什么?(不确定是否返回此部分)

// DEFINE VIEW
var OfferView = Backbone.View.extend({
    initialize: function () {
        this.model = new Offers();
        this.model.fetch();
        this.model.on('change', this.modelChange);
        this.model.on('change', this.render);
        this.modelChange = function () {
            alert('model changed');
        };
        this.render();
    },
    render: function () {
        var self = this;
        this.model.forEach(function (s) {
            var view = new OfferMarketView({
                id: "container" + s.get('name').toLowerCase().replace(/'s*/g, '')
            });
            $('#leftCol').append(view.el);
        });
        return this;
    }
});
var OfferMarketView = Backbone.View.extend({
    tagName: "div",
    className: "marketContainer",
    events: {},
    render: function() {
    }
});

无论何时对模型调用fetch,都会通过可以在模型中定义的parse方法传递响应。parse取一个参数,ajax响应:

parse: function(response) {
}

在该函数中,您可以对ajax请求返回的数据执行任何操作,并最终返回该对象。解析方法返回的对象将在您的模型上设置。

对于事件绑定,您需要在视图中执行此操作。在视图的初始化方法中,您可以执行以下操作:

this.collection.on("change", this.someFunction);

现在,任何时候导致该模型触发其更改事件someFunction(也在您的视图中定义)都将运行。

编辑

您添加到问题中的示例json看起来非常规范。有了这些数据,我就可以把它提取到一个集合中。如果这是您希望模型看起来的结构,那么您不需要做太多解析。

如果您创建了一个执行以下操作的解析方法:

parse: function(response) {
    return response.segments;
}

当您在一个成功的请求中调用fetch this.collection.fetch()时,您的集合将充满模型,这些模型包含与您的响应匹配的结构中的属性。

编辑2

你的装订看起来不错。

在这段代码中:

this.collection.fetch({
    success: function (model, attributes) {
        initAll(attributes);
        // populate ui with attributes from model
    }
})

在集合获取成功时传递回的参数是(collection, response) collection是集合调用的结果,以及this.collection最终会是什么。response是您的ajax请求的响应。

我不确定initAll(attributes)应该做什么。如果您添加一个像我上面发布的解析方法,那么您的集合将包含一组具有每个分段属性的模型。

此外,您可以将呈现绑定到更改事件,而不是在最后调用this.render()

this.collection.on('change', this.render);

这样,每当您的集合发生更改时,该视图都会自动再次渲染,以便显示您的更改。