2012-06-20 56 views
0

我有一個應用程序只在$(document).ready中加載數據一次。集合視圖和模型視圖之間有鏈接。視圖具有異步體系結構,因此它們在頁面刷新上呈現。但是當我點擊這些鏈接時,什麼都沒有呈現,因爲數據已經被抓取並且沒有事件被觸發。是否有插件或竅門可以處理這兩種情況?如何刷新Backbone.js頁面變化的異步視圖?

Backbone.Collection.prototype.lazyLoad = function (id) { 
    var model = this.get(id); 
    if (model === undefined) { 
     model = new this.model({ id: id }); 
     this.add(model); 
     model.fetch(); 
    } 
    return model; 
} 

var Col = Backbone.Collection.extend({ 
    model: Model, 
}); 

var Model = Backbone.Model.extend({}); 

var ColView = Backbone.View.extend({ 
    ... 
    initialize: function() { 
     this.collection.on('reset', this.render); 
    } 
}); 

var ModelView = Backbone.View.extend({ 
    ... 
    initialize: function() { 
     this.model.on('change', this.render); 
    } 
}); 

var AppRouter = Backbone.Router.extend({ 
    routes: { 
     "": "colView", 
     "col/:id": "modelView" 
    }, 

    colView: function() { 
     new ColView(collection: col); 
    } 

    modelView: function (id) { 
     new modelView(model: col.lazyLoad('modelId')); 
    } 
}); 

$(document).ready(function() { 
    col = new Col; 
    col.fetch(); 
    app = new AppRouter(); 
}); 
+1

我們需要在這裏看到更多的代碼。你有鏈接定義的事件處理程序嗎?鏈接有什麼作用?你期待他們做什麼? – tkone

+0

收集視圖有每個模型的鏈接。鏈接由AppRouter管理,即當我點擊'col/modelId'鏈接時,modelView被創建。但是這個視圖只在模型發送「更改」事件時呈現。它不會發生,因爲所有數據都提前獲取。 – chessman

+0

我期望遵循下面的行爲:if(page'col/modelId'被刷新){在數據被提取時渲染'change'事件的模型} else {立即渲染模型} – chessman

回答

1

據我所知,您希望它渲染和顯示視圖,但由於col已經取出這不會觸發,你必然要ModelView's渲染事件change事件。那麼你總是可以自己調用ModelView的渲染。

modelView: function (id) { 
    var view = new modelView({ model: col.lazyLoad('modelId') }); 
    view.render(); 
} 
+0

當用戶刷新頁面時,這不起作用。當調用view.render()時,尚未提取模型。 – chessman

+0

@ user1469049:然後修復你的'渲染器'邏輯來做一些合理的事情(比如渲染一個空模板或一個微調器),如果模型還沒有出現,然後讓適當的事件觸發另一個'render'調用。 –