2013-02-24 93 views
1

我很困惑,可以使用一些帮助。了解backbone.js属性和toJSON()

我渲染函数中,我有以下三个调试行:

  console.debug(this.model); 
      foo = this.model.toJSON(); 
      console.debug(foo); 

在第一线的输出是从服务器获取数据模型实例和属性,属性是人口稠密与我所期望的一样。

但是,第二个console.debug调用包含一个空对象。

什么给?不应该这第二个调试输出位包含相同的属性,但JSONified?

下面的代码完成的位:

function get_race() { 

    var RaceModel = Backbone.Model.extend({ 
     urlRoot: api_root + 'race/1/?format=json', 

    }); 

    var RaceView = Backbone.View.extend({ 
     template: _.template('<h1>a template</h1><h2>desc: <%= year %></h2>'), 
     initialize: function() { 
      this.model = new RaceModel(); 
      this.model.fetch(); 
      this.render(); 
     }, 
     render: function() { 
      console.debug(this.model); 
      foo = this.model.toJSON(); 
      console.debug(foo); 
      this.$el.html(this.template(this.model)); 
      return this; 
     } 
    }); 


    var race_view = new RaceView({ el: $("#backbone_test") }); 
+0

你使用什么浏览器?我曾经在Firefox/Firebug中做过这样的事情,并且在这个用法中看到问题 – 2013-02-24 02:57:39

+0

toJSON中的模型应该返回代表模型实例上属性属性的对象 - 它不会与模型完全相同,因为模型有其他的属性和方法,所以没有看到属性,我不能说你应该看到什么具体的 – kinakuta 2013-02-24 03:01:31

+0

一件事添加 - 不要传递this.model到你的模板函数,通过this.model.attributes – kinakuta 2013-02-24 03:19:50

回答

0

你最有可能被结果在日志中受骗。对象使用正确的值记录的原因是因为console.log()保留对已记录对象的引用。这可以在Chrome中使用下面的html页面可以观察到:

<!doctype html> 
<html lang="en"> 
<head> 
<script type="text/javascript"> 
    var object = { title: null }; 
    console.log(object); 
    function update() { object.title = document.getElementById("title").value; } 
</script> 
</head> 
<body> 
    <input id="title" type="text" value="New title"/><br/> 
    <button onclick="update()">Update title</button> 
</body> 
</html> 
  1. 装载了Chrome的页面加载不开发工具。
  2. 打开javascript控制台并检查记录的实例的值是否为空。
  3. 关闭javascript控制台。
  4. 点击按钮更新标题。
  5. 重新打开JavaScript控制台。标题现在更新为新值,即使它是相同的日志行。

为了确保在渲染视图之前已经加载了值,您需要等待结果。我个人会选择nEEbz解决方案。

3

我认为发生的事情是,使被调用之前的模型被取出。您应该在调用抓取之前将其初始化,然后移除要呈现的调用。

this.listenTo(this.model, "change", this.render); 

当渲染被称为那样通俗易懂,this.model.toJSON()会因为没有什么在那里在该点返回一个空的对象。但是你的调试器在获取this.model时会更新它,因为它显示了一个引用。为了证明这一点,请尝试记录一些不可变的东西,如console.log(JSON.stringify(this.model));

+4

有点讽刺的是,当你在这里遇到竞争状况时,你将它命名为比赛模型;) – 2013-02-24 03:25:04

0

变化中的抓取代码:

that = this 
this.model.fetch(
    success: function() { 
     that.render(); 
);