Подтвердить что ты не робот

Как расширить виджет jquery ui? (1.7)

Я хотел бы создать пользовательскую версию сортируемого виджета. Я искал документацию, но не мог найти что-то действительно точное. Наилучшей информацией я нашел: http://jqueryui.pbworks.com/Widget-factory.

Я пробовал:

$.widget("ui.customsortable", $.extend($.ui.sortable, {
  _init: function() {
    $.widget.prototype._init.apply(this, arguments);
  }
}));

Но $.widget.prototype._init не является функцией, которую я хочу назвать, я предполагаю, так как это прототип $.widget.

Затем я попробовал что-то, что я читал здесь и там:

var _init = $.ui.sortable.prototype._init; 

$.widget("ui.customsortable", $.extend($.ui.sortable, {
  _init: function() {
    _init.apply(this, arguments);
  },
}));

Но:

  • Не могу поверить, что мне нужно хранить все методы, которые я хочу переопределить, это так уродливо.
  • Он выдает ошибку ( "this.refresh не является функцией" ), что означает, что метод обновления не существует. Означает ли это, что мне придется воссоздать все методы, которые я хочу переопределить? В чем смысл расширения в этом случае?

Я что-то пропустил?

Спасибо за вашу помощь!

4b9b3361

Ответ 1

После нескольких попыток я наконец узнал, как сделать это легко:

$.widget("ui.customsortable", $.extend({}, $.ui.sortable.prototype, {

  _init: function(){
    this.element.data('sortable', this.element.data('customsortable'));
    return $.ui.sortable.prototype._init.apply(this, arguments);
  }

  // Override other methods here.

}));

$.ui.customsortable.defaults = $.extend({}, $.ui.sortable.defaults);

Ключом является копирование данных из пользовательского виджета в исходное. Не забудьте использовать $.ui.sortable.prototype. [Overriden method].apply(this, arguments); в каждом методе переопределения.

Холли дерьмо!

Ответ 2

Это странные ответы. Существует необязательный второй параметр - basewidget для наследования. Это легко. Не нужно работать с прототипом и т.д.

$.widget( "ui.customsortable", $.ui.sortable, {

  _init: function() {
    this.element.data('sortable', this.element.data('customsortable'));
    // or whatever you want
  }
} );

Второй параметр $. ui.sortable. Я думаю, все, что вам нужно.

Ответ 3

Относительно выбранного выше решения:

$.widget("ui.customsortable", $.extend(true, {}, $.ui.sortable.prototype, {

Если вы расширяете одну опцию объектов в другую, флаг [deep] значения true даст вам желаемые результаты.

Ответ 4

Я использую это для предопределения функций запуска, остановки и обновления:

$.widget('ui.custom_sortable_or_any_other_name', $.ui.sortable, {
    _init: function() {
        this.element.children().css('position', 'relative'); //for example
    },
    options : {
        start: function (event, ui) {   
            ui.item.addClass('noclick'); //ui.item get the item, that my point
        },
        stop: function (event, ui) {            
        },
        update: function (event, ui) {
            $.ajax(); //some ajax you might want to do
        }
    }
});

Ответ 5

Я не знаю, что вам нужно, когда вы говорите "продлить виджет". В моем случае я хотел изменить, как сам виджет выдал себя, и возиться с классами CSS не удовлетворял. Это не был случай расширения поведения виджета, а скорее изменение поведения виджета.

Итак, я перебрал метод рендеринга. Виджет, о котором идет речь, был автозаполнение jQueryUI, а переезд выглядел следующим образом:

function monkeyPatchAutocomplete() {  

  // don't really need this, but in case I did, I could store it and chain  
  var oldFn = $.ui.autocomplete.prototype._renderItem;  

  $.ui.autocomplete.prototype._renderItem = function( ul, item) {  
     // whatever 
  };  
}  

Я только что назвал это в $(document).ready().


связаны:
- Можно ли заменить или изменить функцию в виджетах jQuery UI? Как?
- jQueryUI: как я могу настроить параметры подключаемого модуля Autocomplete?

Ответ 6

Я использовал этот раз:

$.ui.buttonset.prototype.value = function() {
     return this.element.find('#' + this.element.find('label[aria-pressed="true"]').attr('for')).val();
}