Как я могу переопределить Rails 3 ненавязчивые функции javascript без изменения поставляемого rails.js? - PullRequest
2 голосов
/ 20 марта 2011

Мой Javascript не совсем готов, и я изо всех сил пытаюсь переопределить функцию в прилагаемом rails.js.

Я хочу изменить способ обработки a[data-confirm], используя модальное диалоговое окно jQuery UI, а не ванильный javascript confirm().

Соответствующей функцией в rails.js является allowAction(element). Если я определю это в другом файле, я могу успешно вызвать его из консоли firebug, но версия rails.js по-прежнему вызывается из якорей с атрибутом data-confirm.

Я думаю, это потому, что весь файл rails.js обернут в:

(function($) {
...
})( jQuery );

Есть ли разумный способ переопределить эту функцию, без изменения поставляемого rails.js?

Изменить:

Вызов в rails.js на allowAction заключен в .live вызов:

  $('a[data-confirm], a[data-method], a[data-remote]').live('click.rails', function(e) {
  var link = $(this);
  if (!allowAction(link)) return false;

  if (link.attr('data-remote')) {
    handleRemote(link);
    return false;
  } else if (link.attr('data-method')) {
    handleMethod(link);
    return false;
  }   
});

Я также пытался включить мой javascript до и после rails.js, но безрезультатно.

Edit:

Итак, если я позвоню .die('click.rails'), я смогу переопределить все событие click.rails, но оригинальные функции handleRemote() и handleMethod() не будут вызваны.

Ответы [ 3 ]

7 голосов
/ 26 апреля 2011

К вашему сведению, я просто добавил внешний API к Rails jquery-ujs именно для такого рода вещей.Теперь вы можете заставить rails.js использовать пользовательский метод подтверждения, подключив (и переписав 1 строку) функцию $.rails.allowAction.

См. Мою статью, Rails jQuery UJS: Now Interactive , для полного объяснения с примерами.

РЕДАКТИРОВАТЬ: И теперь, с эта фиксация диалоговая функция confirm может быть переопределена таким же образом.Например,

$.rails.confirm = function(message) { return myConfirmDialog(message); };
1 голос
/ 20 марта 2011

Как это?

//Backup our original function just in case
var backupFunc = allowAction;

//Your replacement function
var myFunc = function(element){
    //Have it your way, badabababa :)
};

//Override default 'allowAction' function

allowAction = myFunc;

/*
    Restore it the way it was before: allowAction = backupFunc;
*/

РЕДАКТИРОВАТЬ: Область действия функций находится в закрытой области видимости.Таким образом, вы не сможете действовать по своему усмотрению.

0 голосов
/ 20 марта 2011

Я только что проверил код rails.js (я использую Rails 3.0.3 и jquery-rails 0.2.7), и точка, где он вызывает метод confirm(), отличается от вашей.Мой выглядит намного проще для замены:

function allowAction(element) {
    var message = element.data('confirm');
    return !message || (fire(element, 'confirm') && confirm(message));
}

Может быть, вы можете обновить свой jquery-rails драгоценный камень (и повторно запустить rails generate jquery:install)?

...