2012-01-17 69 views
27

我正在使用主幹來構建我的Web應用程序。如何在主幹應用程序中刷新頁面

目前我正面臨一個問題,如果我在主頁上,我無法通過再次單擊「主頁」按鈕來刷新同一頁面。

我認爲,這是由骨幹提供的限制(不重新加載頁面,如果相同的URL被調用)

enter image description here

有沒有解決這個辦法嗎?這樣,當我再次點擊主頁按鈕時,我可以觸發頁面重新加載,即再次調用相同的URL?

回答

27

看着backbone.js源代碼,它似乎默認情況下是不可能的,因爲它只響應url更改。而且,由於點擊相同的鏈接,您不會觸發更改事件。

守則Backbone.History:

$(window).bind('hashchange', this.checkUrl); 

你需要處理不改變自己。下面是我所做的:

$('.nav-links').click(function(e) { 
    var newFragment = Backbone.history.getFragment($(this).attr('href')); 
    if (Backbone.history.fragment == newFragment) { 
     // need to null out Backbone.history.fragement because 
     // navigate method will ignore when it is the same as newFragment 
     Backbone.history.fragment = null; 
     Backbone.history.navigate(newFragment, true); 
    } 
}); 
+0

創建後很少有應用程序,我發現有時使用刷新按鈕比實施此解決方法更好/更清晰。 – 2013-06-13 20:22:32

+4

我不知道這個答案是否正確,但它不再是。 'Backbone.history.loadUrl'確實需要什麼,請參閱我的答案。 – amiuhle 2014-04-23 09:25:48

0

這不是最高的主幹。在Chrome(webkit瀏覽器)中工作正常,但不是在Firefox中。它的瀏覽器行爲

0

http://localhost.com/http://localhost.com/#!/之間的區別在於第二個是指向錨點的鏈接,它不加載頁面,它只查找當前頁面中的錨點,如果找到,則滾動到它。你需要讓你的鏈接看起來像第一個,沒有「#」接近結束。

2

我需要「刷新」我的頁面上方向變化的活動,因爲不是所有的我的CSS媒體查詢爲其中默認情況下正確執行肖像模式。這是我落得這樣做:

Backbone.history.fragment = null; 
Backbone.history.navigate(document.location.hash, true); 

當然,對於這個答案的完整性,這種被包裹在一些方向變化處理代碼:

window.addEventListener('orientationchange', function() { 
    Backbone.history.fragment = null; 
    Backbone.history.navigate(document.location.hash, true); 
}, false); 
7

如果要重新加載整個具有所需視圖的頁面。這可能會讓home按鈕變成senes。好處是它會刷新內存。

去任何路由,而不需要加載它(沒有「真」),然後重新加載

Backbone.history.navigate('route/goes/here'); 
window.location.reload(); 
+1

感謝您的這一點。這也刷新了服務器端會話。 – Leahcim 2013-02-07 03:57:27

0

你可以經常修改你的路線,包括圖示,以便您可以追加一個隨機字符串的結束的href使其獨一無二,但仍與「家」路線相匹配。 (注意:讓這是你的最後一條路線。)

在路由

routes: { 
    "*str": "home" 
} 

在視圖

render: function() { 
    var data = {href: +(new Date())}; 
    _.extend(data, this.model.attributes); 
    this.$el.html(this.template(data)); 
    return this; 
} 

在這裏所示的模板(把手):

<a href="{{href}}">Home Link</a> 
1

你也可以只讓一個毫無意義的變化到URL中加入一個隨機數到最後:

var url = $(this).attr('href') + '?rand=' + Math.floor(Math.random() * 1000); 
Backbone.history.navigate(url, true); 

,因爲它不會通過AJAX調用請求新的數據,如果URL沒有這對於IE特別有用改變。

36

您正在尋找Backbone.history.loadUrl。 來自Annotated Source

嘗試加載當前的URL片段。如果路線成功,則返回true。如果沒有定義的路線匹配該片段,則返回false

因此,對於簡單的刷新鏈接,您可以在下面的事件添加到您的Backbone.View

events: { 
    'click a#refresh': function() { 
    Backbone.history.loadUrl(); 
    return false; 
    } 
} 
+2

這是一個更好的答案:更短,更乾淨,並且不涉及Backbone的「內部」('Backbone.history.fragment')。 – machineghost 2015-05-28 18:33:27

0

爲了提供的代碼可重用的片斷我增強了Backbone.View與助手方法無論我們需要重新加載相同的頁面,儘管Backbone路由器的限制。

在我們的app.js文件或任何其他合適的地方

Backbone.View = Backbone.View.extend({ 
    refreshPage: function(e){ 
     if(e.target.pathname){ 
      Backbone.history.navigate(e.target.pathname); 
     } 
     window.location.reload();   
    } 
}); 

這樣,如果我們作爲

<a href="/whatever" id="whateverId">Some text </a> 

在我們看來,這樣的鏈接,我們就只需要點擊事件綁定以回調利用刷新頁面功能,只要refreshPage助手將通過原型鏈可用

events: { 
    'click #whateverId': 'refreshPage', 
} 

至於我們不需要改變「標籤」這是一個清晰的解決方案,將節省一些樣板編碼

希望它可以幫助

0

它與

myBackboneRouter.navigate("users", {trigger: true}) 
1

你可以使用以下方法輕鬆刷新頁面:

@win_loc = window.location.toString().replace("#","") 
Backbone.history.redirectTo(@win_loc) 
5

backbone.history.loadUrl是解決方案。

的點擊處理您的主頁按鈕的功能(如果家裏是你的Web應用程序的根目錄/)應該是:

myAppRouter.navigate(''); 
Backbone.history.loadUrl(); 
+0

好又簡單 – SSS 2014-09-16 04:21:07

0

這裏是我最喜歡的辦法至今:

if (!Backbone.history.navigate(urlPath, true)) { 
     Backbone.history.loadUrl(); 
} 
相關問題