Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Backbone.js设置我的模型_Javascript_Json_Data Binding_Backbone.js_Javascript Framework - Fatal编程技术网

Javascript 使用Backbone.js设置我的模型

Javascript 使用Backbone.js设置我的模型,javascript,json,data-binding,backbone.js,javascript-framework,Javascript,Json,Data Binding,Backbone.js,Javascript Framework,我试图使用Backbone.js简化数据(JSON)管理和与DOM的交互 首先,我不确定Backbone.js是否真的可以简化和改进当前的流程,但我想假设它可以 前面我使用jqueryajax函数检索数据。现在,我正在将数据(仍然使用AJAX)主干样式检索到主干模型中 对于更新,之前我通过JSON对象本身进行解析以更新数据。然后我会将更新后的json发送回后端(就像我收到它一样) 现在,是否可以使用主干中的set函数来简化以下内容,理想情况下,set属性行为(以及所有其他UI绑定,如更改事件)应

我试图使用Backbone.js简化数据(JSON)管理和与DOM的交互

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

前面我使用jqueryajax函数检索数据。现在,我正在将数据(仍然使用AJAX)主干样式检索到主干模型中

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

现在,是否可以使用主干中的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;
                        }
                    }
                }
            }
        }
    }
}
编辑1

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

var Offers = Backbone.Collection.extend({
    url: 'URL',
    parse: function (response) {
        return response.segments;
    }
});
在这里,我得到的不仅仅是回应。还不确定使用render函数或fetchsuccess函数填充DOM是否正确。假设我在DOM中有我的html模板。。。我想使用jQuery clone()克隆它,并使用forEach on segments填充克隆,然后将所有克隆推回到html正文中。这在主干网中可行吗?你会怎么做?(我可以在没有backbone.js的情况下完成这项工作,但我想看看如何使用backbone.js进行改进,并将克隆上的所有数据绑定到模型更改)

编辑2

我可以通过forEach创建单个视图,但在将这些视图插入DOM时遇到了困难。我做错了什么?(不确定该零件周围的退货)


每当您在模型上调用fetch时,响应都会通过可在模型中定义的
parse
方法传递
parse
接受一个参数,即ajax响应:

parse: function(response) {

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

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

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
    }
})
在收集获取成功时传回的参数是
(收集,响应)
收集
是收集调用的结果,而
此集合
最终将被调用
response
是对ajax请求的响应

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

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

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

这样,每当您的集合发生更改时,该视图将自动再次呈现,以便显示您的更改。

您的JSON响应是什么样的,您的模型是什么样的?没有看到他们很难帮上忙。我不需要一个确切的工作替代品。对于任何具有多个嵌套的json>主干网模型,我只想回答问题的最后一段。不看json示例就可以这么说。我是说,是的,你能做到。怎么用?这是一个很好的问题。您可能必须首先转换JSON。您可能需要使用主干插件。你可以直接做。如果看不到更多的代码,很难给你一个更好的答案。这里发布了一个新问题,关于如何将子视图返回到DOM中。嗨,Ryan,谢谢你给parse的提示。我可以想象它会有用。对于模型上的更改,您能看看我添加的代码是否正确/理想吗?当我控制台记录集合时,我得到了整个主干对象。另外,当我在控制台上记录响应时,我会得到完整的JSON响应。解析没有任何效果。。。是这样吗定义模型Offer=Backbone.MODEL.extend();var Offers=Backbone.Collection.extend({model:Offer,url:'url',parse:function(response){return response.segments}});你不需要定义一个模型,除非你有一个你已经扩展并需要使用的模型。主干将为您创建模型并将其放入您的收藏中。当您在控制台上记录集合时,您应该会看到一个名为models的属性,其中每一个都应该有一个名为attributes的属性,其中将包含每个项的数据。Response显示来自服务器的未触及的响应,因此是的,这是正确的,您应该可以在那里看到所有内容。嗨,Ryan,谢谢您的解释。我已经删除了模型,只使用了内部带有parse的集合。我仍然很困惑,希望我上面的编辑1能更好地解释我希望实现的目标。你不应该试图使用你成功后得到的回应。在这一点上,如果您需要它,它可以作为参考,但是假设一切正常,您应该使用返回的
parse: function(response) {
    return response.segments;
}
this.collection.fetch({
    success: function (model, attributes) {
        initAll(attributes);

        // populate ui with attributes from model
    }
})
this.collection.on('change', this.render);