骨干模型,董事会:
define([
'underscore',
'backbone',
'collections/lists',
'iobind',
'iosync'
], function( _, Backbone, Lists,ioBind,ioSync) {
var BoardModel = Backbone.Model.extend({
urlRoot: 'board',
noIoBind: false,
socket: io.connect(''),
idAttribute: '_id',
defaults: {
title: 'One Thousand and One Nights'
},
initialize: function() {
this.id = 1;
this.lists = new Lists;
this.socket.emit('joinBoard',this.id);
_.bindAll(this, 'getBoard');
this.ioBind('initBoard', this.getBoard, this);
},
getBoard: function(data){
this.set(data.data.board[0]);
}
});
return BoardModel;
});
骨干查看:boardView:
var IndexView = Backbone.View.extend({
// Instead of generating a new element, bind to the existing elements in the HTML.
el: '#board',
// Board template html
template: Mustache.render(Template.board),
events: {
},
initialize: function() {
//Init Data
this.model = new Board();
// var lists = {
// lists: [
// {name: "To Do",
// cards:[
// {name: "Art work for A."},
// {name: "B Prototype."},
// {name: "C prototype."}
// ]
// },
// {name: "Doing",
// cards: [
// {name: "Art work for A."}
// ]
// },
// {name: "Done"}
// ]
// }
// var partial = {card: Template.card_in_list};
// var listHtml = Mustache.render(Template.list,lists,partial);
// template = $(this.template).find('.list-area').append(listHtml);
},
render: function() {
console.log(this.model);
console.log(this.model.toJSON());
var partial = {card: Template.card_in_list};
var listHtml = Mustache.render(Template.list,this.model,partial);
template = $(this.template).find('.list-area').append(listHtml);
this.$el.html(template);
}
});
在View函数:render函数中,console.log得到不同的结果。 console.log(this.model)可以获得正确的对象结果:
child
_callbacks: Object
_changing: false
_escapedAttributes: Object
_ioEvents: Object
_pending: Object
_previousAttributes: Object
_silent: Object
attributes: Object
__v: 0
_id: "50b750a7795f285d4e000014"
created: "2012-11-29T12:10:15.269Z"
description: "simple is better, but not simpler"
dueDate: "2012-11-29T12:10:15.269Z"
lists: Array[6]
status: true
title: "test board unique"
__proto__: Object
changed: Object
cid: "c1"
getBoard: function () { [native code] }
id: "50b750a7795f285d4e000014"
lists: child
__proto__: ctor
但是this.model.toJSON()只获取模型默认值:
Object
title: "One Thousand and One Nights"
__proto__: Object
这让我很困惑。任何人都知道为什么同一个模型会得到不同的结果。
答案 0 :(得分:0)
在Backbone模型中,您的业务值(描述,标题...)存储在attributes
属性中。当您在模型上调用toJSON()
时,它所做的是获取attributes
值,并删除Backbone.Model对象框架的函数和属性。
当您手动想要设置模型属性时,您希望使用set
。我不知道你data.data
对象中有什么内容,所以你应该查看文档:{{3}}
设置
model.set(attributes, [options])
设置属性的哈希值(一个或多个) 很多)在模型上。如果任何属性改变模型状态, 除非{silent:true}被传递为,否则将触发“更改”事件 一个选项。还会触发特定属性的更改事件, 你也可以绑定到那些,例如:change:title,和 变化:内容。您也可以传递个人密钥和值。
note.set({title:“March 20”,内容:“在他眼中,她的日食......”});
book.set(“title”,“波希米亚的丑闻”);如果模型有验证 方法,它将在设置属性之前进行验证,无需更改 如果验证失败将发生,并且set将返回false。 否则,set返回对模型的引用。你也可以通过 选项中的错误回调,将调用而不是 如果验证失败,则触发“错误”事件。如果{沉默:真} 作为选项传递,验证推迟到下一个 变化
答案 1 :(得分:0)
我发现我触发了boardView.render两次。当我改变代码时:
a = new boardView;
a.render();
到
a = new boardView;
我完成了这件事。
顺便说一句,感谢Marcel Falliere的评论。