【问题标题】:Invoke function from jquery plugin boiler plate code从 jquery 插件样板代码调用函数
【发布时间】:2016-04-15 14:22:10
【问题描述】:

我找到了不错的 jQuery 插件,它使用样板模板。一切正常,但我无法调用内部函数来获取所选项目。 该插件的构造如下:

    (function ($, window, document) {
    'use strict';

    // constructor
    var SearchableOptionList = function ($element, options) {
        this.$originalElement = $element;
        this.options = options;

        this.metadata = this.$originalElement.data('sol-options');
    };

    // plugin prototype
    SearchableOptionList.prototype = {

        DATA_KEY: 'sol-element',

        // default option values
        defaults: {            
            ... 
        },

        // initialize the plugin
        init: function () {
            this.config = $.extend(true, {}, this.defaults, this.options, this.metadata);

            ...

            return this;
        },

        //some functions
        ...

        selectAll: function () {
            ...
        },

        deselectAll: function () {
            ...
        },

        getSelection: function () {
            return this.$selection.find('input:checked');
        }
    };

    // jquery plugin boiler plate code
    SearchableOptionList.defaults = SearchableOptionList.prototype.defaults;
    window.SearchableOptionList = SearchableOptionList;

    $.fn.searchableOptionList = function (options) {
        var result = [];
        this.each(function () {
            var $this = $(this),
                $alreadyInitializedSol = $this.data(SearchableOptionList.prototype.DATA_KEY);

            if ($alreadyInitializedSol) {
                result.push($alreadyInitializedSol);
            } else {
                var newSol = new SearchableOptionList($this, options);
                result.push(newSol);

                setTimeout(function() {
                    newSol.init();
                }, 0);
            }
        });

        if (result.length === 1) {
            return result[0];
        }

        return result;
    };

}(jQuery, window, document));

您可以在GitHub 上找到完整代码。

我尝试调用getSelection 函数,如下所示:

// initialize sol
    var s = $('#my-select').searchableOptionList({
        maxHeight: '150px',
        showSelectAll: true
    });

    s.selectAll();

我收到一个错误:

TypeError: this.config is undefined

是否可以使用这个样板模板调用函数?

你可以在jsfiddle上玩耍

【问题讨论】:

    标签: javascript jquery jquery-plugins boilerplate


    【解决方案1】:

    我相信line 1031是罪魁祸首

            setTimeout(function() {
                newSol.init();
            }, 0);
    

    由于 init 被延迟,当您立即调用它时,代码还没有准备好。最简单的解决方法是也推迟您的呼叫,但不能保证它会被初始化。

    setTimeout(function(){s.selectAll()},1000);
    

    更好的解决方案是在插件初始化后使用插件的events 挂钩。

    $('#my-select').searchableOptionList({
      maxHeight: '150px',
      events: {
        onInitialized: function() {
          this.selectAll();
        }
      }
    });
    

    fiddle

    【讨论】:

    • 谢谢!你能解释一下为什么作者使用setTimeout吗?有必要吗?
    • 我猜是因为插件允许远程数据,所以它异步处理所有数据。
    • 如果我不打算使用异步数据,我可以省略这个吗?
    • 你可以,但把它留在里面并没有什么坏处。请注意,还有一个地方需要删除超时setTimeout(function () { sol._initializeData();fiddle
    • 太棒了!现在它按我的预期工作。非常感谢您的帮助!对于那些不想存储插件实例的人可以使用$('#my-select').searchableOptionList().selectAll();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多