2013-03-21 74 views
0

我正在使用Backbone.js并试图使用fetch()来填充我的模型。我遇到的问题是返回的数据没有填充我的模型。我发现了一个类似的问题here。不同之处在于,在我的成功函数中,我没有看到任何数据变化,也没有发生“更改”事件。骨干js不使用fetch填充数据模型()

的代码:

模型

window.Company = Backbone.Model.extend({ 
    urlRoot: "/api/company", 
    defaults:{ 
     "id":null, 
     "name":"", 
     "address":"", 
     "city":"", 
     "state":"", 
     "phone":"" 
    }, 
    events: { 
     'change': 'doChange' 
    }, 

    doChange: function(event) { 
     alert('company changed'); 
    } 
}) 

路由器

var AppRouter = Backbone.Router.extend({ 

    routes:{ 
     "":"home", 
     "company/:id":"companyDetails" 
    }, 

    initialize:function() { 
     var user = new User(); 
     this.headerView = new HeaderView({ 
      model: user 
     }); 
     $('.header').html(this.headerView.el); 
     console.log("router initialized."); 
    }, 

    companyDetails: function (id) { 
     var company = new Company({ 
      id: id 
     }); 
     company.fetch({ 
      success: function(){ 
       console.log('company.id is ' + company.id); 
       console.log('company.name is ' + company.name); 
       console.log('company.address is ' + company.address); 
       $("#content").html(new CompanyView({ 
        model: company 
       }).el); 
      } 
     }); 
} 


}); 

JSON

{"address":"555 Main St","name":"Confused Technologies","id":"8dc206cc-1524-4623-a6cd-97c185a76392","state":"CO","city":"Denver","zip":"80206","phone":"5551212"} 

名称和地址始终未定义。我必须俯视一些简单的事情?

编辑

包括错误地离开了模型传递到模板中的视图。

查看

window.CompanyView = Backbone.View.extend({ 

    initialize:function() { 
     this.render(); 
     console.log('CompanyView initialized'); 
    }, 

    render:function (eventName) { 
     $(this.el).html(this.template()); 
     return this; 
    } 

}) 
+0

在成功回调中,'company.get('name')'或'company.toJSON()'说什么? – 2013-03-21 01:42:33

+0

'company.get('name')'似乎返回名称! 'toJSON()'返回'[object Object]'。这是有希望的!开始所有这一切都是在我的下划线模板中,我有'<%= name =>'和'<%= address%>',它们仍然是空的。有什么想法吗? – laduke 2013-03-21 02:50:44

+0

您通常将模板函数调用为'html = template(this.model.toJSON())',那么您怎么做? – 2013-03-21 03:32:06

回答

3

的属性不直接存储在模型上。它们存储在attributes hash中,因此您可以通过company.attributes访问它们,但通常使用company.get(attribute)。沿着相同的路线,您会将company.toJSON()传递给您的模板函数,因为它会返回模型属性的哈希值。

至于你的更改事件没有解雇,我假设你的意思是change: doChange模型的事件散列。骨干模型实际上并没有对事件散列做任何事情。这是为了在Backbone Views上委派DOM事件。我敢打赌,如果您在获取调用之前放入company.on("change", function (model) { console.log(model.toJSON()); })并取消成功回调,您会在控制台中看到您的模型。

此外,我不认为你的$("#content").html...线会像你期望的那样工作。我已经重写你的路由器的回调是这样的:

companyDetails: function (id) { 
    var company = new CompanyView({ 
    el: "#content", 
    model: new Company({ id: id }) 
    }); 

    // This line would be better in your view's initialize, replacing company with this. 
    company.listenTo(company.model, "change", company.render); 

    company.model.fetch(); 
} 

CompanyView#渲染通常会通过this.model.toJSON()到返回的HTML模板函数,并传递到this.$el.html()。所以像this.$el.html(this.template(this.model.toJSON()));

+0

谢谢。这很有帮助。 'company.on(“change”,function(model){console.log(model.toJSON());})'让我改变我的成功回调以包含数据参数。 – laduke 2013-03-21 16:21:09

+0

所以这加上我的观点改变了我更早的更新(实际上将'this.model.toJSON()'传递给模板)。我对事件散列仍然有点模糊,但我相信给我一点时间使用主干我会得到它。 – laduke 2013-03-22 12:44:24

+0

还将+1传递给构造函数。它更清楚地做了我想用'$(“#content”)。html ...'做的事情。 – laduke 2013-03-22 12:53:49

0

好的。不更新我的模型的问题就我可以告诉一个异步问题而言。我更新了成功回调,包括像这样的数据参数:

success: function (data) { 
    $('#content').html(new CompanyView({ 
     model: data 
    }).el); 
} 

注意,我没有通过公司的对象为模型,而原始返回的数据。这解决了我的模型问题。

我在评论中提到,这开始于我的下划线模板变量'<%= name%>'等...是空的。我改变了我的看法:

window.CompanyView = Backbone.View.extend({ 

    initialize:function() { 
     this.render(); 
     console.log('CompanyView initialized'); 
    }, 

    render:function (eventName) { 
     $(this.el).html(this.template(this.model.toJSON())); 
     return this; 
    } 

}) 

那些事情得到了我的模型更新和变量传播到模板。

+0

这似乎不应该工作。当你没有将模型传递给视图时,如何调用this.model.toJSON()? '原始数据'对象不会有toJSON方法。何时渲染? – 2013-03-21 16:32:09

+0

它的工作原理。我是backbone.js的新手,但我相信分配模型“model:data”会对“Backbone.Model”对象进行某种转换。 'render()'在views'initialize'函数中被调用。 – laduke 2013-03-21 18:08:36

+0

编辑帖子以包含完整视图而不仅仅是渲染功能。 – laduke 2013-03-21 18:13:53