2013-08-01 65 views
0

我正在嘗試使用Backbone從JSON API中抽取日常事件,並定期檢查JSON中的更改並重新呈現這些更改。此外 - 應用程序將長時間運行,因此我會定期檢查日期 - 以便在日期更改時,集合的URL和集合的URL將被重新獲取並重新呈現。但是,當我重新獲取數據時(無論它是否已被修改或完全是新數據)---它不會觸發模型或集合上的任何更改事件。骨幹輪詢服務器的變化 - 然後重新渲染?

我可以貼上我的代碼 - 但它可以節省時間,只是簡單地問:

會的過程是輪詢新的/修改的數據服務器,然後添加/刪除/更新視圖上的模型是什麼?我不需要做任何到服務器,只需要拉動內容 - 並在30秒內輪詢更改。

這是同步嗎?取?

我已經在網上搜索了關於這方面的方法 - 但是對Backbone API的不斷更改 - 到目前爲止我還沒有找到可行的解決方案。

感謝您的幫助!

回答

2

首先:主幹這樣有沒有方法來「定期」獲取從API.You數據將需要處理的是使用JavaScript

回答您的每一個問題:

問:什麼會該過程用於輪詢服務器以查找新的/修改的數據,然後添加/刪除/更新視圖上的模型? A.正如上面提到的,你需要處理,通過JS,做這樣的事情

setInterval(function(){ 
//Make an API call to get data 
},30000); 

問:我不需要任何書面形式提供給服務器,只需拔內容 - 和投票以往30秒改變。那會是同步嗎?取?

答:我認爲主幹獲取方法是合適的。

進行API每30秒召喚:

setInterval(function(){ 
    collection.fetch(); 
},30000); 

聽取完整和重新渲染視圖

collection.on('reset',this.render(),this); 

希望這回答了簡而言之查詢。

感謝

+0

感謝您的快速響應! 其實 - 你的建議是我一直在嘗試。 我在集合視圖中設置了collection.on('reset',function,this)',但是當我調用集合上的提取時它不會運行。 http://pastebin.com/4R9gMZEw - 收集視圖 – watts

+0

你嘗試添加一個成功函數到你的collection.fetch,只是爲了檢查它是否有效?就像collection.fetch({成功:功能(RESP){/ /做smething},錯誤:功能(RESP,狀態){/ /檢查出了什麼問題}}); –

+1

我想你需要通過'{reset:true}'作爲一個選項來獲取你的'setInterval'調用,或者在集合上偵聽'sync'事件。 'collection.on('sync',this.render,this)'..note它應該是'this.render',而不是'this.render()'。 – fbynite

1

簡單地說,每一個Backbone組件可以listenTotrigger事件。有很多內置的事件,但沒有阻止你實現自己的事件。

這裏是一個純粹的事件驅動實施解決您的問題。這具有可以輕鬆擴展的優勢,如果您的應用程序中每30秒需要發生一次其他事情,則只需將回調註冊到正確的事件即可。

var Data = Backbone.Collection.extend({ 
    initialize: function() { 
    this.listenTo(Backbone, 'tick:30secs', this.fetch, this); 
    return this; 
    }, 
    // Example date-dependent url. 
    url : function() { 
    var date = new Date(); 
    return 'http://server.com/api/' + date.getFullYear() + '-' + date.getDay(); 
    } 
}); 

var View = Backbone.View.extend({ 
    // Assuming you store your template in the HTML page. 
    template: _.template($('#view-template')), 
    initialize: function() { 
    this.listenTo(this.collection, 'reset change add', this.render, this); 
    setInterval(function() { Backbone.trigger('tick:30secs'); }, 30000); 
    return this; 
    }, 
    render: function() { 
    this.$el.html(this.template(this.collection.toJSON)); 
    return this; 
    } 
}); 

// Start everything up. 
var collection = new Data(), 
    view = new View({ collection: collection }); 
$('body').append(view.el); 
collection.fetch();