2013-05-19 96 views
1

在下面的代碼中,我只需要在Gmaps導航器上調用valuea後才能呈現視圖。 直到我有緯度和經度我不能呈現視圖。 Followina這裏的一些答案我卡住了錯誤Backbone.js在得到返回值後呈現一個視圖

對象[object global]沒有方法'afterRender 感謝您的任何建議。

initialize: function() { 
    $.when(this.beforeRender).then(function(){ 
     this.afterRender(); 
    }); 
}, 

beforeRender: function() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(this.onSuccessUpdatePos, 
               this.onFailUpdatePos); 
    } else {navigator.geolocation.getCurrentPosition(this.onSuccessUpdatePos, 
                this.onFailUpdatePos); 

    } 
}, 

afterRender: function() { 
    this.render(); 
}, 

更新:我沒有,因爲我被告知,它似乎是序列BeforeRender-> render-> AfterRender階段得到尊重。 我還在函數Initialize()中添加了所有的初始化邏輯。 問題在於,將函數放入序列中並不能確保函數render()在獲取結果後啓動。

我也

$.when(this.beforeRender).then(that.render); 

嘗試了作爲建議給我,但還是一直給我的錯誤。看起來beforeRender沒有啓動。這會繼續展示我的錯誤是

未捕獲的SyntaxError:意外的標記ü

我認爲這會發生,因爲sessionStorage的&的localStorage和啓動渲染功能之前,這些都沒有填補。 有沒有一種等待這些結果被返回的有效方法?

+0

你試過'$。當( this.beforeRender)。然後(this.afterRender);' – anomaaly

回答

2

我想你遵循了一些教程,因爲beforeRender和afterRender都不存在於Backbone核心。但是,它們通常由需要在渲染例程之前和之後觸發的事件的人來實現。此外,Backbone將View類的渲染功能留空,所以在需要時由您來實現(甚至是調用它)。

作爲一個副作用,調用render()直接進入initialize()函數通常並不好,因爲通常您需要更多地控制何時以及如何在初始化之後渲染視圖。

這就是說,我會建議:

  • 將所有初始化邏輯的(如您的導航儀檢查)內初始化();
  • 調用渲染()從視圖(新VIEWNAME()調用後右)

如果你真的需要(也許是因爲你的代碼的進一步發展)之前和回調,你可以使用Underscore(可用,因爲它是一個依賴)「wrap」函數。 這樣的做法包括:

initialize: function() 
    this.render = _.wrap(this.render, function(render) { 
     this.beforeRender(); 
     render();      
     this.afterRender(); 
    }); 

}, 
render: function() {}, 
beforeRender: function() {}, 
afterRender: function() {} 

考慮到這一點,我會去(記得來指定View類的onFailUpdatePos):

initialize: function() { 
    if (navigator.geolocation) { 
     navigator.geolocation.getCurrentPosition(this.render, this.onFailUpdatePos); 
    } else { 
     navigator.geolocation.getCurrentPosition(this.render, this.onFailUpdatePos); 
    } 
} 
0

out of context inside then

試試這個..調用它之前保存的的參考。

initialize: function() { 
    var thisView = this; 
    $.when(this.beforeRender).then(function(){ 
     thisView.afterRender(); 
    }); 
}, 
相關問題