簡體   English   中英

如何在Rails應用程序中使用不顯眼的javascript訪問全局javascript變量?

[英]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語言應該可以訪問它。

我的問題是...

  1. 如何在不引人注目的JavaScript代碼內部訪問全局變量?
  2. 由於全局變量被認為是邪惡的,是否有更好的方法從我的入門javascript中訪問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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM