2016-12-29 6 views
0

ruby​​ on railsを使用して、次のコーヒースクリプトでトリガされるコードがあります。コードをトリガすることを意味するページでターボリンクを使用するときにウィンドウ変数をクリアする方法

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

、IはtargetのIDとprogressパラメータ 例えばをロードスクリプトタグとDIVを有します

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

何turbolinksがない場合、これは正常に動作し、コードはそれが意図されており、他のページにはトリガしないページにトリガします。しかし、ターボリンク5.0.1を有効にして、コードがトリガーではないページにアクセスし、コードがトリガーしたページに戻り、コードがトリガーされないページに戻ると、コードがトリガーします最終ページには例外があります。ターボリンクがページ読み込みの間にwindow.progress変数をクリアしていないようです。

スクリプトによって読み込まれたウィンドウ変数がページ間でクリアされるようにするにはどうすればよいですか?

答えて

1

私は今日この同じ問題に似たようなことをしました。私が推測したことは、グローバル変数はターボリンクの訪問間で持続するということです。これはページがリロードされないため実際には理にかなっています。コンテンツは単に上書きされます。私の解決策は、ターボリンクが新しいページをレンダリングする前にデータを破壊することでした。 delete方法はvarで宣言されたjavascriptの変数では動作しませんが、私の場合のようにwindowに割り当てられた属性のために働くん

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

は注意してください。 varを使用している場合は、var progress = nullとします。

要求のライフサイクルでこれを行う場所はa lot of optionsです。私はbefore-renderを選択して、要求が成功した場合にのみデータが破壊されるようにしました。

0

回避策は、グラフが存在するかどうかを検出するためにwindow.progressに依存せず、代わりにIDを使用します。

if $('#target').length > 0 
関連する問題