2016-12-29 37 views
0

在rails上使用ruby,我有用下面的咖啡腳本觸發的代碼;如何在使用turbolinks時清除窗口變量

$ = jQuery 
$(document).on "turbolinks:load", -> 
    if window.progress? 
    // execute code on a div with an id of ```target``` 

在其中的代碼是爲了觸發頁面,我有一個的target ID和它加載progress參數 例如一個腳本標記一個div

<%= javascript_tag id: "window_vars" do %> 
    window.progress = <%= raw graph.data.to_json %> 
<% end -%> 

如果沒有turbolinks,那麼這工作得很好,代碼會觸發它是爲了和其他網頁不會觸發頁面。但是,如果我啓用turbolinks 5.0.1,並且訪問代碼不是意味着觸發的頁面,則訪問代碼確實觸發的頁面,然後返回代碼無意觸發的頁面,代碼觸發器在最後一頁上有例外。似乎渦輪鏈接不清除頁面加載之間的window.progress變量。

如何確保在頁面之間清除通過腳本加載的窗口變量?

回答

1

今天我遇到了類似的問題。我所推測的是,渦輪鏈接訪問之間存在全局變量。這實際上是有意義的,因爲頁面沒有被重新加載;內容只是被覆蓋。我的解決方案是在turbolinks呈現新頁面之前破壞數據。

document.addEventListener('turbolinks:before-render',() => { 
    delete window.progress; 
}) 

注意,delete方法不與var聲明的JavaScript變量的工作,但沒有工作分配給window在我的情況的屬性。如果使用var,則需要執行var progress = null;

您有a lot of options在請求的生命週期中的何處執行此操作。我選擇before-render來確保數據只在請求成功時被「銷燬」。

0

解決方法是不依賴於window.progress來檢測圖是否存在,而是使用id等。

if $('#target').length > 0