2010-12-20 59 views
0

在我的模块模式中,由于某些原因,选项是“未定义的”。有没有人看到他们为什么没有正确传入?为什么不重写选项?

Framework.MyModule = (function(options) { 
    var defaults = { 
     someOption : 1, 
     stuff  : 2 
    }; 
    if (!options) { 
     var options = defaults; 
    } else { 
     for (var index in defaults) { 
      if (typeof options[index] == 'undefined') 
       options[index] = defaults[index]; 
     } 
    } 
    var module = {}; 

    // Initialize 
    _something(); 

    // Private Methods 
    function _something() {} 

    // Public Methods 
    module.click = function() {}; 

    return module; 
})(); 


... docready function ... 

var options = { 
    someOption : 9, 
    stuff  : 10 
}; 

Framework.MyModule(options); 

... end doc ready ... 

请参阅小提琴:http://jsfiddle.net/kWHEZ/1/

+0

有你自动执行之后的声明MyModule的方法的原因是什么? – simshaun 2010-12-20 22:47:43

+0

我明白你已经提供了一些真实的代码(或其中的一些表象)。如果你能够更进一步并提供一个[JSFiddle](http://jsfiddle.net)和一个重现问题的简化示例,那将会很有帮助。 – Phrogz 2010-12-20 22:49:31

+0

如果我不这样做,我不能使用公共方法“Framework.MyModule.click()” – tester 2010-12-20 22:50:32

回答

3
var options = { /* ... */}; 
Framework.MyModule = (function(options) { 
    /* .. options are undefined ... */ 
})(); 

Framework.MyModule = (function(options) { 
    /* .. options are defined... */ 
})(options); 

现在,如果要添加私有/公共变量,仍然可以通过选择你需要使它这样的构造方法与返回的能力,你的公共对象 - 因此不会在立即运行的函数中传递选项。因为让我们诚实..这不真的有道理。


你可以做这样的事情:

var Module = {}; 
Module.Foo = (function($){ // jQuery is accessible as $ 
    var _private = { 
     defaults: { 
      url: '/default-url', container: '#dummy' 
     }, 
     foos: [] 
    }; 

    return function(o){ // returns constructor 
     // other _private variables are accessible here 
     var opts = $.extend({}, _private.defaults, o); 
     var self = { // public return object 
      load: function(){ 
       $(opts.container).load(opts.url); 
      } 
     }; 
     _private.foos.push(self); 
     return self; 
    }; 
})(jQuery); // scope global variables 


var foo1 = Module.Foo({ 
    url: '/test.php', 
    container: '#success' 
}); 

var foo2 = Module.Foo({ 
    url: '/test2.php', 
    container: '#success2' 
}); 

foo1.load(); 
foo2.load(); 
+0

请看小提琴:http://jsfiddle.net/kWHEZ/1/ – tester 2010-12-20 23:06:18

+0

你能详细说明如何添加两个?我相信这是我需要做的......感谢您的帮助! – tester 2010-12-20 23:19:57

+0

@tester - 我详细阐述了答案的更新。有很多方法可以做到这一点。 – 2010-12-21 06:22:23

2

你不能传递任何选项匿名函数调用。

如果您希望它使用自定义选项,您的呼叫将不得不以})(options);结束。

1

您正在立即执行该功能。该函数返回模块,它是一个对象,而不是函数。你是否想要返回一个函数?

然后使用叫它:

Framework.MyModule(options);