用Backbone.js设置我的模型
Setting my model with Backbone.js
我正在尝试使用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);
这样,每当您的集合发生更改时,该视图都会自动再次渲染,以便显示您的更改。
- Angular没有根据模型更新我的选择元素
- 在这种情况下,我应该如何在余烬中放置我的模型有很多关系
- 当输入键由jquery触发时,我的模型是未定义的
- 如果ng-if的计算结果为false,AngularJS会使我的模型数据无效
- MVC4剃刀在客户端javascript中访问我的模型中的JsonResult数据
- 无法在 javascript 中使用我的模型数据
- 为什么我的模型中的默认属性返回未定义
- 在 FTL 中向我的模型发送一个 JavaScript var
- Backbone fetch返回我的模型的所有实例
- 用Backbone.js设置我的模型
- 如果我的模型是MVC3中的QueryTable,如何访问Javascript中的项目数据
- 如何使用Parse cloud js保存我的模型
- 我的模型应该有多细粒度
- 当试图访问我的模型上的方法时,得到Javascript TypeError
- 我的dom不反映我的模型更新值,更新是由一个函数,这是按钮单击CAL完成的
- Backbone.js,require.js:我如何将我的模型、视图和集合转换为require.js模块
- 为什么我的模型值为空,如果我不包装脚本代码中的单击事件
- 我如何验证我的模型,当我有一个数组属性
- 为什么我不能从javascript访问我的模型对象
- ng-repeat不能用Object.create声明我的模型