Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

data() #18

Merged
merged 1 commit into from
Nov 5, 2011
Merged

data() #18

merged 1 commit into from
Nov 5, 2011

Conversation

pyromaniac
Copy link
Contributor

Я таки сделал это. Кажется.

@kaievns
Copy link
Collaborator

kaievns commented Nov 5, 2011

отличненько, сейчас я это немного причешу и приложу

kaievns added a commit that referenced this pull request Nov 5, 2011
@kaievns kaievns merged commit ddc7f81 into rightjs:master Nov 5, 2011
@pyromaniac
Copy link
Contributor Author

Давай, а я посмотрю. А то я типа рубист больше, хотя и считаю себя достаточно искушённым в js. Кстати, я там циклы сделал не итераторами, поскольку на вижу способа замкнуть переменную data, например, в коллбэк так, чтобы оно изменялось и вне коллбэка. Я прав?

@pyromaniac
Copy link
Contributor Author

Кстати, и вот из этого new Function("return " + (data || '{}'))() - думаю, можно убрать || {} - это я у тебя скопипастил и забыл убрать. + хорошо бы это сделать парсером json, как в жквери, но я так понял, что по денфолту json парсер не идёт в либе.

@kaievns
Copy link
Collaborator

kaievns commented Nov 5, 2011

JSON интерфейс есть везде встроенный. кроме старых ИЕ. но это лечится

@pyromaniac
Copy link
Contributor Author

Да, про новые браузеры знаю, а для ие ведь придётся подключать http://ru.rightjs.org/plugins/json, верно? Будет просто не очевидное поведение.

@pyromaniac
Copy link
Contributor Author

Кстати, я RightJS юзаю вот тут - https://github.com/puffer/puffer, надеюсь это хоть немного поможет популяризации фреймворка, ибо jQuery меня не устраивает в целом.

И вот ещё вопрос - ты не думал юзать sizzle для селекторов? Он одна из двух прекраснейших частей jquery. Второй была data() как раз ) Ну и портировать соответствующие методы, типа Element.is()

@kaievns
Copy link
Collaborator

kaievns commented Nov 5, 2011

http://rightjs.org/plugins/sizzle Element.is -> Element#match

@pyromaniac
Copy link
Contributor Author

Точно! Вылетело из головы. Снова перечитываю доки )

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

окей, все кончилось тем, что я встроил JSON плагин в ядро (давно уже пора было) и переписал все следующим образом

https://github.com/rightjs/rightjs-core/blob/2.3.0/src/dom/element/commons.js#L164-183

@pyromaniac
Copy link
Contributor Author

Прелесть data не только в том, что можно читать и писать аттрибуты, преобразуя их в структуры данных, но и доступе разной степени вложенности. То есть, если напишу у элемента <a "data-remote-url"="/hello">, то a.data('remote') должен вернуть {url: 'hello'}, да и добавленные data данные ни к чему писать как data- аттрибуты - только dom нагружать. Достаточно хранить данные в элементе. data- аттрибуты нужны только для того чтобы инициализировать некоторые части data хеша при загрузке страницы.

@pyromaniac
Copy link
Contributor Author

А JSON парсинг - это круто, да. Странно, что в жквери при наличии json в core сделали через задницу - https://github.com/jquery/jquery/blob/master/src/data.js#L323

Это я у них скопировал немного кода.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

про data-remote-url="hello" - имхо бред дизайнера. data-remote='{url: "hello"}' не только правильнее, но и проще с программной точки зрения, т.к. на стороне сервера можно просто вызвать smth#to_json не выдумывая нового формата на ровном месте.

@pyromaniac
Copy link
Contributor Author

В jquery не просто так замутили это дело - http://www.w3.org/TR/html5/elements.html#embedding-custom-non-visible-data-with-the-data-attributes

Это дело у них соответствует спецификации. Думаю, right тоже должен соответствовать спецификации w3c - там серьёзные ребята работают.

@pyromaniac
Copy link
Contributor Author

Вот по поводу совсем глобального датасета на все элементы - это они да, фигню придумали в jquery. Каждый элемент должен хранить собственный датасет по идее.

Ну и ещё мой косяк в том, что я загружаю data- аттрибуты 1 раз. А надо бы проверять каждый раз. Но там становится не очень понятно, как действовать в случае удаления данных из датасета и наличия их в аттрибутах, например. Надо это крепко думать ещё.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

по поводу w3c - давно известно что там работают люди оторванные от реальности :)

но вообще идею понял, озадачился.

@pyromaniac
Copy link
Contributor Author

Не, шутки-шутками, но ребята своё дело знают и делаю. Хоть и очень медленно ) А идея - я тебе скажу. Я сам уже использовал эту возможность - выборку части дата-сета по составному ключу. Так же, как и выборку общего куска датасета, составленного из разных data- аттрибутов. Удобно это.

А чем озадачился? Я по сути сделал всё, тебе надо пройтись и откровенные мои косяки поправить, потому что там да, не всё идеально. Или тебя что-то там сильно не устраивает? Ты расскажи - вместе подумаем. Одна голова - хорошо..., как говорится.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

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

Во-вторых не стоит прегружать неймспейс отдельными методами loadData, readData, removeData. Должен быть один метод Element#data который и читает и записывает и удаляет.

Написал поновой https://github.com/rightjs/rightjs-core/blob/2.3.0/src/dom/element/commons.js#L164-206

соответственно юзкейсы https://github.com/rightjs/rightjs-core/blob/2.3.0/test/unit/dom/element/commons_test.js#L171

посмотри плз, ничего не пропустил?

@pyromaniac
Copy link
Contributor Author

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

Думаю, тут ты прав. Можно хранить и в аттрибутах, только алгоритмы будут очень сложными.

Во-вторых не стоит прегружать неймспейс отдельными методами loadData, readData, removeData. Должен быть один метод Element#data который и читает и записывает и удаляет.

Эти методы я сделать только для того, чтобы сделать код более читабельным. Хорошо бы убрать их в приват, только я ещё пока не понял, как. Можно, например, замкнуть их в функцию - и дело в шоколаде

посмотри плз, ничего не пропустил?

this.assertEqual({
      one: 1, two: 2, threeOne: 3.1
    }, element.data('thing'));

Да вот я сомневаюсь, что оно должно быть так.

this.assertEqual({
      one: 1, two: 2, three: {one: 3.1}
    }, element.data('thing'));

Может таки вот так?

Плюс метод data() без параметров, по идее, должен возвращать весь дата-сет. {thing: {one: 1, two: 2, three: {one: 3.1}}} - типа того.

@pyromaniac
Copy link
Contributor Author

А хотя подожди. Получается, что я не прав. всё, что после data- преобразуется в имя аттрибута. Таки ты прав.

Только если смотреть на спецификацию, получается, что

    var element = new Element('div', {
      'data-thing-one': '1',
      'data-thing-two': '2',
      'data-thing-three-one': '3.1'
    });

    this.assertEqual({
      thingOne: 1, thingTwo: 2, thingThreeOne: 3.1
    }, element.data());

    this.assertEqual(1, element.data(thing-one));

Что-то я сам запутался.

For example, given the following HTML:

<div data-role="page" data-last-value="43" data-hidden="true" data-options='{"name":"John"}'></div>

All of the following jQuery code will work.

$("div").data("role") === "page";
$("div").data("lastValue") === 43;
$("div").data("hidden") === true;
$("div").data("options").name === "John";

Это из http://api.jquery.com/data/

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

судя по ссылке на w3c что ты мне давал, там есть пример

<div class="spaceship" data-ship-id="92432"
     data-weapons="laser 2" data-shields="50%"
     data-x="30" data-y="10" data-z="90">
 <button class="fire"
         onclick="spaceships[this.parentNode.dataset.shipId].fire()">
  Fire
 </button>
</div>

см. dataset.shipId соответственно имена верблюжируются внутри датасета я так понимаю

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

data-options='{"name":"John"}' будет тоже самое, т.к. Element#data пытается вытащить JSON при считывании данных

@pyromaniac
Copy link
Contributor Author

Да, но верблюжируются они от самой data-

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

помоему от текущего скопа, просто data- - дефолтовое пространство. его там можно указать через отдельный метод. Соответственно вызов element.data('name') - это вызов пространства data-name

@pyromaniac
Copy link
Contributor Author

Я говорю о том, что https://github.com/rightjs/rightjs-core/blob/2.3.0/test/unit/dom/element/commons_test.js#L171 - этот спек не правильный получается. data-thing-one - это data('thingOne') и не получится сделать data('thing')

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

ммм... не понял. можно сделать data('thing') и он вернет хэш из всех атрибутов в подпространстве, а можно сделать data('thing-one') или data('thingOne') и отгда он вернет данные напрямую из data-thing-one. В чем проблема?

@pyromaniac
Copy link
Contributor Author

Всё. Теперь я понял окончательно. Всё здорово тогда.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

Отлично, я тогда помечаю 2.3.0 тегом и надеюсь через пару часов будет релиз :)

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

Тебя как зовут вообще? :) хочется помянуть в кредитсах. и ссылку на куданибудь если можно

@pyromaniac
Copy link
Contributor Author

Аркадий. https://github.com/pyromaniac ссылка )

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

а фамилия? :)

@pyromaniac
Copy link
Contributor Author

Да вот я думаю, лучше даже без имени ) pyromaniac и всё.

@valpackett
Copy link

вручную credits писать нафига? тупо ссылку на https://github.com/rightjs/rightjs-core/contributors

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

ну ладно :) приятно познакомиться кстати

@pyromaniac
Copy link
Contributor Author

И мне тоже.
Моя паранойя подсказывает мне, что за нами следят.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

@myfreeweb просто хочу помянуть кто что делал

@pyromaniac
Copy link
Contributor Author

Да ладно, от моего кода там ничего не осталось ) Потом что-нибудь стоящее напишу. Надо двигать райт. Засилие жквери меня вгоняет в дипрессию, а прототайп умер.

Самое неприятное, что из-за мощной поддержки сообщества приходится в больших проектах юзать жквери. А райт оставлять либо для личных, либо для небольших проектов, про которые просто забываешь после окончания.

@kaievns
Copy link
Collaborator

kaievns commented Nov 6, 2011

ну осталось не осталось, а носом тыкнули тоже спасибо. я вот не в курсе вообще был про эти дела.

тесты кстати остались :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants