使用backbone.iobind,backbonejs model.toJSON()无法获得正确的输出

时间:2012-12-01 16:10:19

标签: javascript backbone.js

骨干模型,董事会:

 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
这让我很困惑。任何人都知道为什么同一个模型会得到不同的结果。

2 个答案:

答案 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的评论。