jQuery - $.widget

k3nguruh

Erfahrenes Mitglied
Hallo,

ich beschäftige mich seit kurzem mit dem $.widget - Plugin. Mittlerweile konnte ich auch ein kleines Plugin schreiben. Jetz stehe ich aber vor einem Problem.

Erstmal zu dem Grundgerüst:
Code:
;(function($) {
    $.widget('k3.pluginName', {
        version: '1.0.0',
        //
        // Default options
        defaults: {
        },
        //
        // Privat methods
        _create: function() {
          
            var filterElem = this.element.find('.myClass')._filter('myData', 1);

        },
        // usw.

        //
        // Public methods
        show: function() {
        }
    });
})(jQuery);

Jetzt möchte ich in dem Plugin die folgende Funktion benutzen können. Diese muss also irgendwo darin integriert werden.
Code:
$.fn._filter = function(prop, value) {
    return this.filter(function() {
        return $(this).attr(prop) == value || $(this).data(prop) == value;
    });
};
Als methode kann man es anscheinend nicht einbinden.
Wo muss ich die _filter Funktion jetzt einbinden, damit ich die in dem Plugin benutzen kann?

Schon jetzt mal besten Dank für die Hilfe.
 
Hallo K3nguruh!

Möchtest du wirklich die Funktion _filter im globalen jQuery-Namensraum veröffentlichen?
In deinem Fall würde ich davon abraten, denn es scheint, als ob nur du innerhalb des Plugins diese Funktion bräuchtest.

So hattest du es wahrscheinlich vorher:
Javascript:
var filterElem = this.element.find('.myClass').filter(function () {
  return $(this).attr('myData') == 1 || $(this).data('myData') == 1;
});
Wenn du dieselbe Filterart mehrfach brauchst, kannst du einen Funktion schreiben, die selbst eine Funktion zurückgibt:
Javascript:
function myFilter(prop, value) {
  return function () {
    return $(this).attr(prop) == value || $(this).data(prop) == value;
  };
}

// Und so nutzt du sie:
var filterElem = this.element.find('.myClass').filter(myFilter('myData', 1));

myFilter könntest du entweder als _myFilter (so wie _create) ablegen oder direkt unter der ersten Zeile vor dem $.widget(...).
 
Hallo ComFreek,

Möchtest du wirklich die Funktion _filter im globalen jQuery-Namensraum veröffentlichen?

Möchte ich nicht. Diese Function soll nur für dieses Plugin gelten.

Nochmal zur Verständigung....
Code:
;(function($) {
    $.widget('k3.pluginName', {
        version: '1.0.0',
        //
        // Default options
        defaults: {
        },
        //
        // Privat methods
        _create: function() {
          
            var filterElem = this.element.find('.myClass').filter(myFilter('myData', 1));

        },
        // usw.

        //
        // Public methods
        show: function() {
        }
    });

    //
    // Helper functions
    function myFilter(prop, value) {
        return function () {
            return $(this).attr(prop) == value || $(this).data(prop) == value;
        };
    }

})(jQuery);
So richtig?

myFilter könntest du entweder als _myFilter (so wie _create) ablegen .......
Kannst du mir das bitte mal an meinem Grundgerüst zeigen? Verstehe das nicht ganz.
 
Sollte so passen. (Function Deklarationen und ihre Definitionen [= ihr Rumpf] werden vom JS-Interpreter hochgezogen / gehoisted: http://adripofjavascript.com/blog/drips/variable-and-function-hoisting.)

Javascript:
;(function($) {
    $.widget('k3.pluginName', {
        version: '1.0.0',
        //
        // Default options
        defaults: {
        },
        //
        // Privat methods
       _myFilter: function(prop, value) { ... },
        _create: function() {
          
            var filterElem = this.element.find('.myClass').filter(this._myFilter('myData', 1));

        },
        // usw.

        //
        // Public methods
        show: function() {
        }
    });
})(jQuery);
 
Zurück