2012-04-30 70 views
1

我試圖訪問的模型的數組的項目時,它的提高的錯誤,但似乎找到正確的屬性,並將其寫入到控制檯仍骨幹模型屬性提升類型錯誤被稱爲

class GD.Views.Place extends Backbone.View 
    template: JST['mobile/templates/place'] 
    initialize: -> 
    @model.on('change', @render, this) 
    render: -> 
    $(@el).html(@template(place:@model, open:@openNow())) 
    console.log @model.get("coordinates") 
    console.log @model.get("coordinates")[0] 
    console.log @model.get("coordinates")[1] 
    console.log("done") 
    this 
    openNow: -> 
    ... 

的觀點並沒有呈現在屏幕上,我在我的控制檯

Uncaught TypeError: Cannot read property '0' of undefined 
    GD.Views.Place.Place.render 
    GD.Routers.Main.Main.place 
    _.extend.route 
    (anonymous function) 
    _.some._.any 
    _.extend.loadUrl 
    _.extend.start 
    window.GD.init 
    (anonymous function) 
    jQuery.Callbacks.fire 
    jQuery.Callbacks.self.fireWith 
    jQuery.extend.ready 
    DOMContentLoaded 
[51.4528837, -0.9739059999999428] 
51.4528837 
-0.9739059999999428 
done 

錯誤消息指的是上述第二和第三的console.log線看到這條消息。在訪問嵌入式哈希中的更多屬性時,它似乎也會引發錯誤。

我不明白爲什麼會發生這種情況或如何解決它。感謝提前的幫助/耐心!

+0

什麼'@ model.get(「coordinates」)'return? – asawyer

+0

不確定這是否相關,但不應該將@ model.toJSON()傳遞給模板? – Sandro

+0

@asawyer:它會返回[51.4528837,-0.9739059999999428],如上面的控制檯輸出 –

回答

4

通常的模式與骨幹網的看法是這樣的:

v = new V 
$(something).append(v.render().el) 

如果您結合起來,與一個共同的模式初始化一個模型:

m = new M 
m.fetch() # asynchronous! 

那麼你就可以得到這樣的:

m = new M 
m.fetch() 
v = new V(model: m) 
$(something).append(v.render().el) 

這將允許append呼叫內的v.render()呼叫發生之前該模型已從服務器獲取。對你來說,這將意味着@model.get('coordinates')undefinedv.render()撥打以上,你會得到:

Uncaught TypeError: Cannot read property '0' of undefined 
... 

屆時,m.fetch()從服務器和triggers a "change" event獲取數據,這種情況下會再打電話render您視圖,你會得到這個:

[51.4528837, -0.9739059999999428] 
51.4528837 
-0.9739059999999428 
done 

消息的順序正是你在控制檯中看到的。

我猜找你做這樣的事情(如上):

m = new M 
m.fetch() 
v = new V(model: m) 
$(something).append(v.render().el) 

嘗試檢查,看看是否@model其實裏面裝和render扔了某種「加載... 「消息,如果不是;然後讓"change"事件觸發「真實」渲染。


PS:你可以在CoffeeScript中使用@代替this

initialize: -> 
    @model.on('change', @render, @) 
render: -> 
    #... 
    @ 

你也可以使用一個fat arrow (=>)來定義render方法,而不用擔心提供上下文來@model.on

initialize: -> 
    @model.on('change', @render) 
render: => 
    #... 
    @ 

此外,如果您使用的是最新版本的Backbone,則您有$el在您的視圖實例,所以你可以:

render: => 
    @$el.html(...) 
    #... 
    @ 
+0

這個解釋是有道理的。你說的我的電話結構是如此,所以我編輯我的路由器到這個: 'place:(id) - > @model = new GD.Models.Place({id:「#{id}」}) (data) view = new GD.Views.Place(model:data) 這工作正常,頁面呈現。 –

+0

對我來說,仍然是一個神話,這就是爲什麼模型中的改變不能正確地觸發渲染方法並改變div內容。 是否與這條線有關 - '$('#container')。html(view.render()。el)' - 在路由器中出現錯誤,因此沒有內容可刷新。 處理這類事情的標準做法是什麼?有沒有? –

+1

@socratic_singh:事件正在觸發,這就是爲什麼你正在獲得第二次成功的「render」調用。錯誤是(可能)來自在'fetch'完成之前調用'view.render()'。我的標準做法是檢查模型是否可以在'render'(或者等價地,在模板中)渲染,並將'render'綁定到''change''事件,這樣我就不必擔心時間。 –