2013-03-21 72 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