Javascript 使用Backbone.js设置我的模型
我试图使用Backbone.js简化数据(JSON)管理和与DOM的交互 首先,我不确定Backbone.js是否真的可以简化和改进当前的流程,但我想假设它可以 前面我使用jqueryajax函数检索数据。现在,我正在将数据(仍然使用AJAX)主干样式检索到主干模型中 对于更新,之前我通过JSON对象本身进行解析以更新数据。然后我会将更新后的json发送回后端(就像我收到它一样) 现在,是否可以使用主干中的set函数来简化以下内容,理想情况下,set属性行为(以及所有其他UI绑定,如更改事件)应该在哪里构建?它是否位于视图初始值设定项中的fetch()成功处理程序上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绑定,如更改事件)应
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);