2014-02-09 84 views
0

我试图使用Require.js模块化JavaScript应用程序。我想弄清楚如何处理应用程序中使用的全局变量。我读过的所有内容都表明,Require.js的要点之一就是摆脱全局变量。反正我有一个互动这样的:Require.js如何处理全局变量?

function myFunction() 
{ 
    // Access some dynamic variables here 
} 

$('#myButton').on('click', myFunction()); 

mySettings = {}; 

$('#myForm').on('submit', function() 
{ 
    mySettings.someSetting = "someValue"; 

    $.ajax(....) // Send the mySettings to some PHP script 
} 

所以总结起来,应用程序是交互式的,几个控件和事物的用户在页面上确实有访问全局可访问的变量和价值观,它必须是能够与他们互动和做些事情。

没有全局变量,我该怎么做?

回答

0

Check out this answer first

您需要在您的settings.js创建一个单独的文件是这样的:

(function(){ 

    define([], function(){ 

     var settings = { 

     }; 

     return { 
      GetSettings: function() { return settings; } 
     }; 
    }); 

})(); 

然后将其包含在你的模块,像这样

define(['./settings'], function(settings){ 

    var mySettings = settings.GetSettings(); 

}); 

但是!我会建议使用像角,灰烬或Durandle框架 - 它们提供了处理这种类型的情况要好得多方式

0

创建settings模块:

define(function() { 
    return { 
     settingA: "some value", 
     settingB: true, 
     settingC: {a: 1, b: 2, c: 3} 
    }; 
}); 

如果settings模块是为了在全球范围内使用,我会在名称settings下提供它,而不是使用相对路径。所以我把这个在RequireJS配置:

paths: { 
    "settings": "path/to/the/actual/settings" 
} 

然后需要这样的:

define(["settings"], function (mySettings) { 
    function myFunction() 
    { 
     // Access some dynamic variables here 
    } 

    $('#myButton').on('click', myFunction()); 

    $('#myForm').on('submit', function() 
    { 
     mySettings.someSetting = "someValue"; 

     $.ajax(....) // Send the mySettings to some PHP script 
    } 
}); 

这是做它的基本途径。

+0

如果页面上的不同事件需要以不同方式处理设置会怎么样?也许点击按钮触发ajax发送设置的地方。也许页面上的其他元素与相同的设置值完全不同。我需要为需要发生的每个不同行为设置不同的模块吗? –

+0

另外,以上定义需要关于onclick事件(或使用它的任何交互式事件)在哪里?为什么它定义()而不是require()? –

+0

按顺序回答你的问题...... 1.我在你描述的内容中没有读到任何内容,它会强制使用不同的设置模块来执行不同的操作。我会编辑答案。我假设你的问题中的代码将在一个模块中。它可以和'require([“settings”],function(settings){'。 – Louis

相关问题