[英]How can I access global javascript variables in unobtrusive javascript in a Rails app?
頁面加載后,Rails 4應用程序中的一個視圖將加載一個簡單的javascript以創建Ace編輯器的實例...
$(function() {
var editor = ace.edit("editor");
}):
在這種情況下,我有一個簡單的ajax按鈕...
<%= button_to "Set Content", {controller: :pages, action: 'set_content'}, remote: true %>
要求一些不引人注目的JavaScript ...
editor.setValue("New content has been set");
但這不起作用。 我猜這是行不通的,因為未定義editor
。 由於ajax調用會以靜默方式失敗,並且我不知道如何使用與調試普通javascript代碼相同的Chrome工具來調試不引人注意的javascript代碼,因此無法驗證這是否是實際問題,但這是我的最佳猜測。
我的印象是,如果我編寫var editor
,則將其聲明為全局變量,我的Java語言應該可以訪問它。
我的問題是...
editor
變量? 在此先感謝您的智慧!
當在函數內部使用var關鍵字時,該變量的作用域是該函數的局部作用,因此您對全局作用域的假設不正確。 要使變量成為全局變量,請在函數外部聲明它:
var editor;
$(function(){
editor = ace.edit('editor');
});
或者,您可以簡單地引用window對象(這是瀏覽器中的“全局”對象
$(function(){
window.editor = ace.edit('editor');
});
關於避免全局變量,使用單個全局變量(通常稱為“ app”或“ myCompany”等)來提供可全局訪問的名稱空間是合理的。
var app = {};
$(function(){
app.editor = ace.edit('editor');
});
這至少限制了新變量的范圍,因此您不會錯誤地覆蓋全局變量。 但是,避免全局變量的真正答案在於應用程序的整體體系結構,如果不查看更多代碼,就無法真正解決該問題。 一般來說,如果您編寫的所有代碼都在jquery ready函數內部,則不需要全局變量。 與簡單使用jquery時常見的即席代碼相比,諸如angular,ember和骨干之類的框架為此類事物提供了更好的結構。
$(function() {
var editor = ace.edit("editor");
});
在其回調函數的上下文中創建一個局部變量編輯器。 要在其他位置訪問它,您需要將其設置為全局window.editor = ace.edit("editor")
,或使用類似以下內容將其添加到命名空間中
window.App = {};
App.editor = ace.edit("editor");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.