Javascript 我的jquery插件和访问全局查询似乎不合适。更好的方法?

Javascript 我的jquery插件和访问全局查询似乎不合适。更好的方法?,javascript,jquery,Javascript,Jquery,我问了之前的一个问题,我觉得我不够简洁。下面是我的代码示例和对全局函数的访问。我觉得这是一个糟糕的形式,但鉴于我的插件格式,我找不到另一种方法来实现这一点 我相信我可以将我的函数应用到一个方法var,然后通过调用中的插件来实例化它,但到目前为止,我的插件并不是这样设置的,我认为这可能需要更多的工作。但我想听听更有经验的jQuery插件创建者的意见 用法: 数据是前置的。随着动态内容的创建。我收集了一些与此相关的信息,将其打包,发送一个ajax调用,然后更新视图。事情是这样的。我的插件可以在一个页

我问了之前的一个问题,我觉得我不够简洁。下面是我的代码示例和对全局函数的访问。我觉得这是一个糟糕的形式,但鉴于我的插件格式,我找不到另一种方法来实现这一点

我相信我可以将我的函数应用到一个方法var,然后通过调用中的插件来实例化它,但到目前为止,我的插件并不是这样设置的,我认为这可能需要更多的工作。但我想听听更有经验的jQuery插件创建者的意见

用法: 数据是前置的。随着动态内容的创建。我收集了一些与此相关的信息,将其打包,发送一个ajax调用,然后更新视图。事情是这样的。我的插件可以在一个页面上被多次调用。但问题是,在调用插件之前,我需要获取一些数据对象,这样我就可以对它们进行操作,并确定“我需要更新什么”。这就是我的问题。我需要从插件外部获取一些数据。然后我需要把它传过来。这是否被认为是“适当的”

我的希望是我可以将数据导入插件的方法中,然后当我调用它时,我就有了数据来进行一些显示选择

if ( typeof Object.create !== 'function' ) {
Object.create = function( obj ) {
    function F() {};
    F.prototype = obj;
    return new F();
};
}
// this is the global that I push each reiteration of data into.
var perLineDataArray = [];
(function( $, window, document, undefined ) {
var Sustainability = {
    _init: function( options, elem ) {
        var self = this;
        self.elem = elem;
        self.$elem = $( elem );
        /* plugin call has all the data I need, I pass it in here */
        self.perLineData = groupedperLineData;
        self.url = 'path_to_url/sustainability';
        self.options = $.extend( {}, $.fn.querysustainability.options, options );
        self._extractUrlData();
        self._cleanup();

    },
            _extractUrlData: function(){
               // this is where I would go thru each of the data objects and 
               // determine WHAT in the view needs updating based on some critera.
            },
    _getsustain: function()
            {
              var self = this;
              $.ajax({
                       // my ajax call data
                            success: function(data){
                                this._buildUpdate(data);
                            }
                  });
            },
    _buildDispaly: function( results ) {
        var self = this;
        self.sustainability = $.map( results, function( obj, i) {
            return $( self.options.wrapDisplay ).append ( obj.text )[0];
        });
    },
            _cleanup: function(){
               // clean out global array for next funneling of grouped up data
               perLineDataArray = [];
            },
    _showMessage: function() {
        var self = this;
        self.$elem[ self.options.transition ]( 500, function() {
             $(this).html( self.sustainability )[ self.options.transition ]( 500 );
        });

    },
};
$.fn.querysustainability = function( options, method ) {
    return this.each(function() {
        var sustainability = Object.create( sustainability );
        sustainability._init( options, this );
        $.data( this, 'querysustainability', sustainability );
    });
};

$.fn.querysustainability.options = {
    display: '<span></span>',
    usedClass : 'uniqueclass',
    transition: 'fadeToggle'
};


 })( jQuery, window, document );
然后,当显示是构建的,我有了我需要的所有对象时,我调用插件

    jQuery('#planets').querysustainability({
        groupedperLineData: perLineDataArray
     });
或者我可以在这里添加全局变量:

    $.fn.querysustainability.options = {
    display: '<span></span>',
    usedClass : 'uniqueclass',
    transition: 'fadeToggle',
    groupedperLineData: perLineDataArray
};
$.fn.querysustainability.options={
显示:“”,
usedClass:“uniqueclass”,
过渡:“fadeToggle”,
groupedperLineData:perLineDataArray
};
我的直觉告诉我,我想让插件封装所有东西,但我的另一部分感觉我需要传递我需要操作的东西,现在让插件检索它

那么,有没有一种方法可以调用插件的一个子方法,存储数据集,然后当我调用插件时,它是否已经准备好了数据


你的想法?如果您觉得我应该如何解决这个问题,代码方面?

好的,正如前面在评论中提到的,下面是我最基本的jQuery插件布局模板。通过它,你可以设计出几乎任何你想要的jQuery插件,并且拥有大量的通用性。这是不言自明的。只要看一看,如果它有帮助,很好,如果不让我知道,我会删除它作为一个答案

/*  Example Plug-in Setup   */
(function($) {
    if (!$.myExample) { // your plugin namespace
        $.extend({
            myExample: function(elm, command, args) {
                return elm.each(function(index){
                    // do work to each element as its passed through
                    // be sure to use something like
                    //      return elm.each(function(e) { dor work });
                    // as your final statement in order to maintain "chainability"
                });
            }
        });
        $.fn.extend({
            myExample: function(command) {
                return $.myExample($(this), command, Array.prototype.slice.call(arguments, 1));
            }
        });
        $.myExample.props = {
            key1: "value",
            key2: "value"
        };
        $.myExample.methods = {
            key1: function(param) {

            },
            key2: function(param) {

            }
        };
        $.myExample.init = function(param) {
            var key = "value",
                key2 = {
                    subKey: "value"
                };
                /*
                /  run any number of initializing functions here
                /  I prefer to make my param a value that can be a
                /   string with a possible object
                /    the string for holding a base configuration
                /    the object for any change in properties or base values for that config
                */
        };
        $.myExample.defaults = {
            key1: "value",
            key2: {
                prop1: {
                    subKey1: "value",
                    subKey2: "value"
                },
                prop2: {
                    subKey1: "value"
                }
            },
            key3: function(param) {

            }
        };
    }
})(jQuery);

Mu建议在“使用”插件之前,而不是在调用插件之前,在“init”函数中创建必须调用的函数,但我还没有完全阅读您的工作。但这只是我的第一个想法。这可能是我能做的——但我该怎么做呢?唯一的方法是创建一个“方法”变量,然后实例化它们吗?我已经看到了这些问题的答案。。但好奇的是,我的实现是否能让它工作,或者使用一个global是否可以?只是一个建议,globals几乎从来都不好,因为插件需要自我维持。换句话说,我需要能够在任何平台上与jQuery一起使用它。我建议将数组添加到插件的名称空间中,或者甚至可以考虑使用jQuery的.data()功能。我有一个基本的插件布局,我会尝试在tommorow找到它,然后为你发布,或者通过电子邮件发送给你或者其他什么。它基本上是一个模板,您只需将其用作插件的布局方案。这真的很容易理解,我已经一遍又一遍地使用它为公司制作了几十个插件。哦,如果你可以的话,那就太好了。真的很感谢。嘿,世爵-我做了一些研究,我想我了解你对数据的使用,你认为这合适吗?我可以将一些dataObj绑定到我的每个元素上。然后,当我调用插件时,我可以收集所有的数据属性,运行这些数据并做出一些选择。。但我想看看你有什么样的模板插件,因为我猜我的是有点不正常。
/*  Example Plug-in Setup   */
(function($) {
    if (!$.myExample) { // your plugin namespace
        $.extend({
            myExample: function(elm, command, args) {
                return elm.each(function(index){
                    // do work to each element as its passed through
                    // be sure to use something like
                    //      return elm.each(function(e) { dor work });
                    // as your final statement in order to maintain "chainability"
                });
            }
        });
        $.fn.extend({
            myExample: function(command) {
                return $.myExample($(this), command, Array.prototype.slice.call(arguments, 1));
            }
        });
        $.myExample.props = {
            key1: "value",
            key2: "value"
        };
        $.myExample.methods = {
            key1: function(param) {

            },
            key2: function(param) {

            }
        };
        $.myExample.init = function(param) {
            var key = "value",
                key2 = {
                    subKey: "value"
                };
                /*
                /  run any number of initializing functions here
                /  I prefer to make my param a value that can be a
                /   string with a possible object
                /    the string for holding a base configuration
                /    the object for any change in properties or base values for that config
                */
        };
        $.myExample.defaults = {
            key1: "value",
            key2: {
                prop1: {
                    subKey1: "value",
                    subKey2: "value"
                },
                prop2: {
                    subKey1: "value"
                }
            },
            key3: function(param) {

            }
        };
    }
})(jQuery);