Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Слежение за объектом (https://javascript.ru/forum/events/24745-slezhenie-za-obektom.html)

inst 12.01.2012 18:54

Слежение за объектом
 
Добрый день. Ищу совета.

Вкратце: как кроссбраузерно повесить слушатель изменений одного массива? Как это работает?

Подробности
Принцип такой: есть на HTML-странице некий изначально пустой ненумерованный список. Просто
<ul></ul>
И во время загрузки с сервера запрашивается JSON объект примерно такого вида:
{
	"item1": {
		"icon": "icon.png",
		"text": "Подпись значка"
	},
	"item2": {
		"icon": "icon2.png",
		"text": "Подпись другого значка"
	}
}

После обработки объекта в список добавляются все перечисленные пункты. Ссылка на этот массив сохраняется.

Теперь хочу сделать, чтобы все изменения, внесённые в этот массив автоматически отображались на список на странице.

В связи с этим вопрос: это же возможно? Всё что мне удалось найти своими силами это некий фреймворк tent, писанный каким-то дядей, но он мне показался слишком монструозным для такой задачи. Может существует что-то полегче, чего я не нашёл?

trikadin 12.01.2012 19:10

Просто сделайте свои ф-ции изменения этого объекта, которые будут вызывать обработчик.

inst 12.01.2012 19:23

Да, такой вариант тоже рассматривается, но это на крайний случай.

Всё же хотелось бы что-нибудь наиболее простое с точки зрения результирующего API.

trikadin 12.01.2012 19:26

Это не крайний случай, это правильное решение)

KupueIIIKo 12.01.2012 19:28

Сравнивать) того чего нет добавлять с помощью innerHTML то что пропало удалять если я правильно понял

inst 12.01.2012 19:45

Цитата:

Сообщение от trikadin (Сообщение 149913)
Это не крайний случай, это правильное решение)

Вероятно, это так, но выглядит довольно избыточно: добавить элемент списка, удалить, изменить его имя, иконку, текст, переместить в списке выше, ниже. Всё это лишние сущности, как мне кажется. А если структура объекта немного изменится?

inst 12.01.2012 19:46

Цитата:

Сообщение от KupueIIIKo (Сообщение 149915)
Сравнивать) того чего нет добавлять с помощью innerHTML то что пропало удалять если я правильно понял

Отчего же заниматься тем, с чем браузер теоретически и сам неплохо справляется? :)

trikadin 12.01.2012 20:05

Цитата:

Сообщение от inst
Вероятно, это так, но выглядит довольно избыточно: добавить элемент списка, удалить, изменить его имя, иконку, текст, переместить в списке выше, ниже. Всё это лишние сущности, как мне кажется. А если структура объекта немного изменится?

Сделайте класс Menu, в нём сделайте методы changeIcon, changeText, moveToPosition... В этих методах добавьте вызов обработчика. А если структура объекта немного изменится - добавите новые методы. Это в любом случае лучше, чем менять св-ва объекта напрямую.

poorking 12.01.2012 20:58

Object.prototype.watch|unwatch - то что нужно, можно слушать изменение значений переменных

trikadin 12.01.2012 21:07

poorking, а можно поподробнее?

poorking 12.01.2012 21:13

trikadin,
https://developer.mozilla.org/en/Jav...s/Object/watch

KupueIIIKo 12.01.2012 22:08

По мне так через Jquery $.unique $.extend

trikadin 12.01.2012 22:27

poorking, а, так геко-онли же. Тогда понятно)

poorking 12.01.2012 22:43

trikadin,
ой прошу прощения, не обратил внимания что ТС отметил что надо кроссбраузерно.

Ну тогда придумать свои события и самому же их "поджигать". jQuery: bind + trigger если память не изменяет. А события изменения значений переменных пока только Gecko позволяет отлавливать, может, конечно и у других браузеров есть свои специфичные инструменты, не исследовал тему. А вообще вот этот which, на мой взгляд, здоровская штука, жаль не стандартная

trikadin 12.01.2012 22:51

Потому что не нужна никому, кроме разработчиков, вот и не парятся стандартизаторщики)

И вообще, мне кажется, что при продуманном коде оно и не понадобится)

KupueIIIKo 12.01.2012 22:54

trikadin,
Пролистал Джон Резиг - "Профессиональные приёмы программирования" не помогло решить мою проблему((( с head

А теперь по теме! Помоему теми 2 функциями в jquery, что я предложил решаеться это в несколько строк ) к чему демогония?)

trikadin 13.01.2012 01:12

KupueIIIKo, а причём тут они? Я как-то не понимаю)

Цитата:

Сообщение от KupueIIIKo
демогония

Демагогия, наверное.

inst 13.01.2012 01:14

Цитата:

Сообщение от trikadin (Сообщение 149993)
poorking, а, так геко-онли же. Тогда понятно)

Нет, в tent поддерживается ie7+, chrome 10, opera 9.80 и Firefox 4. Значит это осуществимо кроссбраузерно.

inst 13.01.2012 01:15

Цитата:

Сообщение от trikadin (Сообщение 149997)
Потому что не нужна никому, кроме разработчиков, вот и не парятся стандартизаторщики)

А разве не Mozilla - главный стандартизатор?

Цитата:

Сообщение от trikadin (Сообщение 149997)
И вообще, мне кажется, что при продуманном коде оно и не понадобится)

Всё-таки, моё мнение пока не изменилось.

inst 13.01.2012 01:20

Вообще, спасибо poorking за подсказку, именно это я искал. Уже нашёл jQuery плагин для кроссбраузерности, а также библиотеку Reactive Extensions, так что выбор есть - буду изучать. На край обращусь к tent.

Так что акцессоров скорее всего удастся избежать :)

trikadin 13.01.2012 01:38

Цитата:

Сообщение от inst
А разве не Mozilla - главный стандартизатор?

Эм. Нет)


Часовой пояс GMT +3, время: 11:56.