0

プラグイン自体からパブリックメソッドを呼び出すのに問題があります。問題が何であるかわかりません。私は何が間違っているのですか?

(function($) {

    var MyPlugin = function(){

        /* PUBLIC */
        this.publicFunction = function() {
            // Do public things
        };

        /* PRIVATE */
        var privateFunction = function() {
            // Do private things

            // Call this one public function
            publicFunction(); // WANT THIS but doesn't work
        }
    };

    $.fn.myPlugin = function() {

        var myPlugin = new MyPlugin(options);

        // Binding click to public function
        $("a").bind('click', function(e){
            e.preventDefault();
            myPlugin.publicFunction($(this)); // AND WANT THIS but does
        });

        return myPlugin;
    };
})(jQuery);
4

3 に答える 3

2

thisスコープを失うことなく、関数自体の中からMyPluginのオブジェクトを参照できる必要があります。これを行うには、それを変数に割り当てます(名前は関係ありません、一般的な規則はself

var MyPlugin = function(){
    var self = this;
    ...
    var privatefunction = function () {
        self.publicFunction();
    }
...
于 2012-09-14T15:51:44.480 に答える
1

MyPlugin関数内に、MyPluginインスタンスへの参照をキャッシュします。

var self = this;

次に、privateFunction内で、selfのメンバーとしてpublicFunctionを呼び出します。

self.publicFunction();

問題は、publicFunctionをグローバルではなくMyPluginインスタンスのメンバーとして定義したことです(これは良いことです)が、別のスコープから呼び出しています。publicFunctionはグローバルではないため、javascriptに次の場所を指定する必要があります。それを見つけるために。this呼び出している場所のコンテキスト内でthis、MyPluginインスタンスを指さないため、使用できません。

于 2012-09-14T15:51:34.330 に答える
0
(function($) {

    var MyPlugin = function(options){

        /* PRIVATE - one copy for each instance */
        var options = $.extend({},options),
            privateFunction = function() {
                // Do private things
                // ...
                // Call this one public function
                this.publicFunction();
            };
    };

    // Shared by all MyPlugin instances;
    MyPlugin.prototype.publicFunction = function($element) {
            // Do public things
    };

    $.fn.myPlugin = function() {

        var myPlugin = new MyPlugin(options);

        // Binding click to public function
        $("a").bind('click', function(e){
            e.preventDefault();
            myPlugin.publicFunction($(this));
        });

        return myPlugin;
    };
})(jQuery);
于 2012-09-14T16:06:28.817 に答える