2015-08-15 84 views
2

我目前正在運行一個編譯的scripts.js文件,它使用onRendered方法激活了一堆各種UI功能(砌體,導航條等)。MeteorJS在重新加載時沒有運行外部script.js?

Template.mainLayout.onRendered(function() { 
    $.getScript('js/scripts.js'); 
}); 

我的問題是,如果我瀏覽到像/團隊另一個頁面,該腳本不會重新運行,在其他頁面的意思,砌築不工作了。此外,當我回到主頁時,腳本也會中斷,導致導航欄斷開。

請讓我知道如果我使用這個功能是錯誤的?

+0

您是否在熨斗路由器中使用'mainLayout'? – FullStack

+0

不,我正在使用流路由器和火焰佈局。我現在使用相同的函數直接在scripts.js文件中加載腳本。 – eddiewang

回答

1

如果您自己託管腳本,請將它們放入您的client/compatibility文件夾中。流星會自動將它們包含在您的應用程序中。

如果要從CDN加載它們,請編輯您的client/index.html文件夾以添加script標記。

然後在您的onRendered回調中,將代碼初始化爲您的自定義腳本,例如, this.$('table').datatable()或其他。

+0

現在就來一個更接近的解決方案。通過客戶端/兼容性加載它們,並且我已經在未被重新加載的代碼中作用域。然而,onRendered只初始化我的腳本,我怎樣才能重新初始化每個重新加載腳本(到一個新的路線)? – eddiewang

+1

如果'onRendered'沒有重新運行,那是因爲你的模板沒有重新渲染 - 即使它消失並返回(即你改變了路由並返回)。爲了迫使它重新渲染,它需要包含一個變化的變量;例如,返回'Date.now()'或其他的幫助器。如果這感覺很糟糕,那是因爲它是 - 如果你認爲你的模板在Meteor認爲它不需要時需要重新渲染,那麼更大的可能是錯誤的。我建議你在一個新問題中發佈你的具體情況/代碼(包括jQuery插件或者你可能試圖初始化的類似代碼)。 –

+0

我嘗試這樣做: 'Template.mainLayout.helpers({ \t反應:Date.now() });' 這僅僅是一個學習項目,所以哈克是好的。然而,即使我設置了一個變化的變量,它仍然不會強制退回。 – eddiewang

0

Eddie,.getscript()是一個異步函數,所以你需要指定一個回調函數。我需要在流星中加載一個外部JS,用於傳單插件。使用異步,定義回調函數做了破解:

$.getScript('js/l.control.geosearch.js', function(data, textStatus, jqxhr) { 
     $.getScript('js/l.geosearch.provider.google.js', function(data, textStatus, jqxhr) { 
      new L.Control.GeoSearch({ 
       provider: new L.GeoSearch.Provider.Google(), 
       position: 'topcenter', 
       showMarker: false, 
       retainZoomLevel: true, 
      }).addTo(map); 
     }) 
    }) 
相關問題