Function#wrap

7 views
Skip to first unread message

pyromaniac

unread,
Feb 1, 2011, 9:18:15 AM2/1/11
to RightJS Для Бородатых Хакеров
Николай, привет. Я тут штуку смастерил:

Function.include({
wrap: function(wrapper) {
var __method = this;
return function() {
var length = arguments.length,
args = [];
for (var i = 0; i < length; i++) {args.push(arguments[i])}
var a = [__method.bind(this)].concat(args);
return wrapper.apply(this, a);
}
}
});

Может, интересно тебе будет добавить в релиз - действительно удобная
штука. Если интересует - могу попробовать тестами покрыть.

А ещё я сделал простой rails.js, который работает. У тебя в right-
rails много лишнего, мне так кажется, чего для ujs не нужно. И ещё там
есть дикий баг - таргет для data-remote проверяется вручную,
делегаторы не используются и получается, что <a href="/bla" data-
remote="true"><span>Hello</span></a> работать не будет, поскольку
таргет - span.

pyromaniac

unread,
Feb 1, 2011, 9:18:15 AM2/1/11
to RightJS Для Бородатых Хакеров

Nikolay Nemshilov

unread,
Feb 1, 2011, 9:25:01 AM2/1/11
to right...@googlegroups.com
Привет,

Можно пару примеров, что этот врап делает?


Касательно rails.js там ничего лишнего нет :) RR - очень нужная штука для стандартных ajax операций см. right-rails-demo

Насчет бага, посмотрю, но с RightJS 2.2 имхо должно все работать, там UJS обновился и он теперь срабатывает на внутренние элементы тоже.

--
Nikolay V. Nemshilov
The Web-Developer

pyromaniac -

unread,
Feb 1, 2011, 9:39:41 AM2/1/11
to right...@googlegroups.com
Autocompleter.prototype.done = Autocompleter.prototype.done.wrap(function(proceed, current) {
  console.log(current);
  proceed(current);
});

Вообще, это метод из прототайпа - http://www.prototypejs.org/api/function/wrap
Великолепно помогает точить под себя сторонние либы, не трогая их сорцы.

Чтобы не было бага в rails.js - заюзай делегацию событий на 'a[data-confirm], a[data-method], a[data-remote]', это ведь красивее, чем заново писать её, да ещё и кастомную, да ещё и с багом )

А, и я ориентируюсь на рельсы 3. Там вообще не нужно ничего, ни хелперов левых, ни яваскрипта. Только rails.js.

1 февраля 2011 г. 17:25 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 1, 2011, 9:56:30 AM2/1/11
to right...@googlegroups.com
Наследование и инжекция функциональности не менее великолепно помогают с этими делами 

Autocompleter.include({
  done: function() {
    // something
    return this.$super();
  }
});


касательно рельсы, модуль писался еще под RightJS 1 где еще нормального ujs не было. руки еще пока не дошли сделать по уму. если есть более красивое решение, шлите патч (желательно на github) посмотрим.

насчет упрощенной версии, никто вам не запрещает использовать только rails.js, но RR интерфейс и Ruby aliases в сборке по умолчанию будут присутствовать, т.к. люди их используют.

pyromaniac -

unread,
Feb 1, 2011, 10:21:50 AM2/1/11
to right...@googlegroups.com
Блин, точно, спасибо, у меня прототайп в башке до сих пор.

Кстати, раз уж речь пошла о наследовании - есть тот самый Autocompleter#done, он файрит одноимённый эвент. Как бы попатчить красиво, чтобы в эвенте этом был доступен current? Я хочу переприсвоить нужное мне значение инпуту.

1 февраля 2011 г. 17:56 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 1, 2011, 11:22:46 AM2/1/11
to right...@googlegroups.com
Да, прототайповская модель наследования немного имхо подпорчена питоном, в RightJS классы почти один в один сделаны как в Ruby/Rails

Насчет автокомплитера, все просто. Autocompleter - унаследован от Element и представляет собой обычный UL элемент, соответственно можно делать поиск внутри через #find и т.п. Патчить сам класс для этого вовсе не обязательно. Вот как примерно это сделано на rightjs.org c API поиском

new Autocompleter('api-search-field', {
  url: '/docs/search/%{search}.js',
  onDone: function() {
    var current = this.first('.current');
    if (current) {
      document.location.href = current.get('title');
    }
  }
});

событие 'done' как и любое другое срабатывает внутри самого комплитера, мы находим через #find выбранный пользователем элемент и делаем с ним что-либо. в данном случае я сохранял урлы в поле 'title', соответственно я просто считываю его и перенаправляю браузер. Вы можете установить значение инпута если вам нужно, например вот так

if (current) {
   this.input.setValue(current.text());
}

или как-то так

Nikolay Nemshilov

unread,
Feb 1, 2011, 11:25:33 AM2/1/11
to right...@googlegroups.com
Или другой вариант, создать свой подкласс автокомплитера и делать все внутри него

var MyCompleter = new Class(Autocompleter, {
  initialize: function(input, options) {
    this.$super(input, options);
    this.onDone(this._doMyStuff);
  },

  _doMyStuff: function() {
    var current = this.find('.current');
    // ...
  }
});

var completer = new MyCompleter('some-id', {options});




On Feb 1, 2011, at 6:21 PM, pyromaniac - wrote:

pyromaniac -

unread,
Feb 2, 2011, 6:46:57 AM2/2/11
to right...@googlegroups.com
Спасибо большое. Если я ещё раз захочу, чтобы все мои идеи разбивались кем-то в пух и прах - обязательно напишу )

1 февраля 2011 г. 19:25 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 2, 2011, 8:42:43 AM2/2/11
to right...@googlegroups.com
да и просто пишите :)

pyromaniac -

unread,
Feb 4, 2011, 4:39:41 AM2/4/11
to right...@googlegroups.com
Николай, а вот такой вопросик назрел: для sortable режима дерева нет, да?

2 февраля 2011 г. 16:42 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 4, 2011, 6:18:59 AM2/4/11
to right...@googlegroups.com
Нет, нету. Дерево планируется сделать отдельным виджетом. Но это не сейчас, потом попозже.

pyromaniac -

unread,
Feb 4, 2011, 8:46:00 AM2/4/11
to right...@googlegroups.com
Сейчас. Я займусь, если вы не против.

4 февраля 2011 г. 14:18 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 4, 2011, 9:35:39 AM2/4/11
to right...@googlegroups.com
Естественно не против, только делайте отдельным проектом, если все красиво будет тогда посмотрим

pyromaniac -

unread,
Feb 4, 2011, 6:20:06 PM2/4/11
to right...@googlegroups.com
Кстати, тут такая штука: получилось так, что у меня табы в приложении лежат внутри элемента списка. Типа, <ul>...<li><ul data-tabs=""></ul></li>...</ul>

И получилось так, что от моего li был margin-bottom: 5px, он унаследовался и табы сломались. Думаю, есть смысл сделать что-то типа:

.rui-tabs-tab
{
  ...
  margin: 0;
  padding: 0;
  margin-right: 0.1em;
  ...
}

Соответственно, для всех критичных элементов.

4 февраля 2011 г. 17:35 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

Nikolay Nemshilov

unread,
Feb 5, 2011, 7:53:44 AM2/5/11
to right...@googlegroups.com
Используйте дивы вместо LI или назначьте им свои классы, или используйте CSS2 конструкции ul.my-thing > li

В RightJS UI виджеты идут с самым минимальным набором стилей, дальше каждый сам решает что ему удобно в его приложении, полный ресет или сквозные стили. Тут на всех не угадаешь.

pyromaniac -

unread,
Feb 5, 2011, 10:13:22 AM2/5/11
to right...@googlegroups.com
Да, я просто стили у себя подправил. А делать стилей по-минимуму - это вы правы, да.

Кстати, не могу завтавить у tabs срабатывать событие onRemove. При этом onSelect тот же срабатывает только в путь. Там ничего не сломано?

5 февраля 2011 г. 15:53 пользователь Nikolay Nemshilov <nems...@gmail.com> написал:

pyromaniac -

unread,
Feb 5, 2011, 10:45:05 AM2/5/11
to right...@googlegroups.com
По поводу remove - происходит следующее, я вешаю обработчик на rui-tabs, событие срабатывает на rui-tabs-tab, а дальше не поднимается, поскольку некуда - наш rui-tabs-tab уже похерен из DOM, поэтому не имеет parent(). Что делать? Вешать обработчик на каждый tab?

5 февраля 2011 г. 18:13 пользователь pyromaniac - <kinw...@gmail.com> написал:

pyromaniac -

unread,
Feb 5, 2011, 10:48:54 AM2/5/11
to right...@googlegroups.com
Опачки, а ведь не подвесить на каждый таб. Таба в дереве уже нет, когда событие срабатывает, поэтому делегация не канает. Я даже не знаю, что делать.

5 февраля 2011 г. 18:45 пользователь pyromaniac - <kinw...@gmail.com> написал:

pyromaniac -

unread,
Feb 5, 2011, 11:31:33 AM2/5/11
to right...@googlegroups.com
Кстати, заметил ещё одну штуку: если прописать onRemove, например, в опциях при инициализации табов, то создаются 2 одинаковых объекта в $listeners. В связи с этим, обработчик отрабатывает дважды. Заметил такое поведение для всех проверенных мной эвентов в табах. Это баг или фича? )

5 февраля 2011 г. 18:48 пользователь pyromaniac - <kinw...@gmail.com> написал:

pyromaniac -

unread,
Aug 16, 2011, 2:30:27 PM8/16/11
to right...@googlegroups.com
Привет снова.

https://github.com/rightjs/rightjs-ui/blob/9cac4653fa775e77e27571cf5341084bccf9c9b4/src/slider/slider.js#L250 - вот тут баг заметил. Значение type у меня null почему-то, поэтому оно ломится в другие ветки условий и там уже ломается. if (!type) будет в самый раз там.

5 февраля 2011 г. 20:31 пользователь pyromaniac - <kinw...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages