_create 関数内に jQuery UI 関数があるvar self = this
ので、プラグイン内の他の関数からプラグイン コンテキストにアクセスできます。
_create 関数内に次のコードもあります。
//setup sortable handler
if (self.options.sortable !== false) {
var soptions = {
items:'.tagit-choice',
containment:'parent',
start:function (event, ui) {
console.log('sorting started', event, ui);
self._sortable.tag = $(ui.item);
self._sortable.origIndex = self._sortable.tag.index();
},
update:function (event, ui) {
console.log('sorting started', event, ui);
self._sortable.newIndex = self._sortable.tag.index();
self._moveTag(self._sortable.origIndex, self._sortable.newIndex);
console.log('moved tag', self._sortable.origIndex, 'to', self._sortable.newIndex);
}
};
if (self.options.sortable == 'handle') {
$('.tagit-choice', this.element).prepend('<a class="ui-icon ui-icon-grip-dotted-vertical" style="float:left"></a>');
soptions.handle = 'a.ui-icon';
soptions.cursor = 'move';
}
self.element.sortable(soptions);
}
プラグイン内でソート可能に設定します。
プラグインインスタンスであると予想されるself._moveTag
内部で呼び出している場所への呼び出しがありますが、代わりに. どうしてこれなの?console.log(self)
self
DOMWindow
_moveTag: function (old_index, new_index) {
console.log(self);
self.tagsArray.splice(new_index, 0, self.tagsArray.splice(old_index, 1)[0]);
for (var ind in self.tagsArray)
self.tagsArray[ind].index = ind;
if(self.options.select){
$('option:eq(' + old_index + ')', this.select).insertBefore($('option:eq(' + new_index + ')', this.select));
}
},
うまくいけば、この例はより明確です:
(function($) {
$.widget("ui.widgetName", {
options: {
sortable: true
},
_sortable: {},
_create: function() {
var self = this;
if (self.options.sortable !== false) {
self.element.sortable({
items: '.tagit-choice',
containment: 'parent',
start: function(event, ui) {
self._sortable.tag = $(ui.item);
self._sortable.origIndex = self._sortable.tag.index();
},
update: function(event, ui) {
self._sortable.newIndex = self._sortable.tag.index();
self._moveTag(self._sortable.origIndex, self._sortable.newIndex);
}
});
}
},
_moveTag: function(old_index, new_index) {
console.log(self); // <-- this returns DOMWindow?!?!?
}
});
})(jQuery);