2013-07-15 50 views
0

我有一個div#遊戲。 在這裏,我想從服務器的一些數據出現。 因此,當我使用初始化函數時,我用ajax調用從我的服務器請求數據到我的遊戲模型中。初始化後的主幹渲染 - 初始化get的觸發提前?

Game = Backbone.View.extend(
{ 
    id: 'game', 

    initialize: function() 
    { 
     this.model.on('getGame', function() {}); 
     this.model.getGame(); 
    } 
} 

因爲回調在骨幹中似乎不起作用,所以必須進行觸發。 因此,應用程序將偵聽觸發器getGame,該觸發器在服務器的數據已返回並保存到模型中的變量時觸發。

到目前爲止好,這一切工作。現在唯一的問題是,我想讓我的div#遊戲在完成時添加getGame函數中的所有數據。

但我認爲是因爲關閉了model.on(觸發器)初始化函數'認爲'在運行getGame()函數後就準備好了,而實際上並沒有附加服務器的數據。

所以父DIV#所有正在運行的以下內容:

this.$el.append(new Game().el); 

也「認爲」股利#遊戲準備和追加DIV#遊戲本身,並給它一個淡入。

DIV#遊戲不包含服務器的數據還沒有,所以當它實際上並在圖像和文本的流行回來進入存在,而不是淡入在很好...

有人是否知道如何解決這個問題? 在此先感謝!

============================================== ========

解決

的問題是在$不用彷徨的異步特性和$。員額功能。這就是爲什麼在結果從服務器返回之前初始化已準備就緒。我將它改爲$ .ajax,並將async:false。現在它按照我編程/想要的順序加載。

謝謝您的詳細解釋Tallmaris,它會派上用場,因爲我會使用很多觸發器!

回答

1

而不是讓div#all渲染和視圖追加到本身,你可以把它作爲一個parent到視圖:

this.gameView = new Game({parent: this}); 

然後在您的Game觀點:

initialize: function (options) 
    this.parent = options.parent 
    { 
    this.model.on('getGame', function() { this.$el.appendTo(this.parent); }); 
    this.model.getGame(); 
    } 

另外,您可以使用像這樣的全局骨幹事件對象:

window.vent = $.extend({}, Backbone.Events); 

現在你有一個全局對象(你可以命名,並把任何名稱空間,只要你喜歡,不只是做它在上面的代碼),您可以使用這樣的:

主視圖:

initialize: function() { 
    vent.on("GameReady", function() 
     { 
     // fade in game view 
     }); 
} 

遊戲顯示:

initialize: function (options) 
    this.parent = options.parent 
    { 
     this.model.on('getGame', function() { vent.trigger("GameReady"); }); 
     this.model.getGame(); 
    } 

您也可以圍繞傳遞參數。閱讀here for more documentation

+0

感謝您的快速反應,它看起來不錯! =) 但父母div#都知道什麼時候開始淡入? 而'this.parent'是一個對象,爲了能夠附加你必須附加到this.parent。$ el right? – Dex

+0

是的,對不起,您需要'this.parent。$ el'。這個想法應該是'Game'視圖可以在'this。$ el.fadeIn()'中褪色。或者,您可以使用全局Backbone事件對象。我會用那個更新答案。 – Tallmaris

+0

謝謝,我嘗試了一些谷歌搜索,發現問題實際上比我想象的要簡單得多!問題出在$ .get和$ .post函數的異步屬性中。這就是爲什麼在結果從服務器返回之前初始化已準備就緒。 我將它改爲$ .ajax,並將async:false。 現在它按照我編程的順序加載。 – Dex