Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 12.02.2015, 10:20
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

1. допустим есть виджет текстового поля(с множеством значений), естественно у каждого поля свой id в базе и оно уникально, они принадлежат объекту, каждое поле отображается на клиент в виде виджета(в каждом производятся операции например удаление, добавление значения, переименование поля, перерисовка).
2. тогда есть класс виджета тектового поля от которого элементу виджета сопоставляет функции для управления записью в нем,
3. Теперь допустим в объекте 3 поля, на каждое естественно, надо навесить отдельный экземпляр объектов класса WidgetTextField, для этого используется глобальный менеджер, который инициализирует такие объекты для ВСЕХ виджетов на странице.
Ответить с цитированием
  #12 (permalink)  
Старый 12.02.2015, 10:25
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

допусти в виджете объекта мы раз нажади кнопку добавить поле;
1. поле добавилось
2. происходит рендеринг виджета, в котором менеджер перезапускается
кликнули 2 раз, (1,2) выполнилось 2 раза, 3 раз - 4 раза, а менеджер говорит на консоль каждый раз когда запускается
Ответить с цитированием
  #13 (permalink)  
Старый 12.02.2015, 10:27
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

Но так происходит только в этом виджете, виджет текстового поля при нажатии на кнопку добавляния значения всегда 1 раз срабатывает, и напомню, каждый клик на виджете перезапускает менеджер.
Ответить с цитированием
  #14 (permalink)  
Старый 12.02.2015, 10:33
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Цитата:
далее в цикле по селекторам создает через new для блоков виджетов функции их обрабатывающие
Покажи подробней
Кодом, если можно.

Цитата:
1. допустим есть виджет текстового поля(с множеством значений), естественно у каждого поля свой id в базе и оно уникально, они принадлежат объекту, каждое поле отображается на клиент в виде виджета(в каждом производятся операции например удаление, добавление значения, переименование поля, перерисовка).
2. тогда есть класс виджета тектового поля от которого элементу виджета сопоставляет функции для управления записью в нем,
3. Теперь допустим в объекте 3 поля, на каждое естественно, надо навесить отдельный экземпляр объектов класса WidgetTextField, для этого используется глобальный менеджер, который инициализирует такие объекты для ВСЕХ виджетов на странице.
Ты там свой MVC-фреймворк, чтоли, велосипедишь? Почему бы не использовать уже готовые Backbone+Marionette/Chaplin, React или Angular?
Ответить с цитированием
  #15 (permalink)  
Старый 12.02.2015, 10:34
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

Никакой не через жопу, все в соответствии с ооп на javascript, если ты не знаком с этим то не надо тут кричать что все через жопу, а вопрос простой и повторю его еще раз: почему после очистки массива хендлеры остаются
Ответить с цитированием
  #16 (permalink)  
Старый 12.02.2015, 10:35
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

Manager = function() {
    // Срабатывает каждый раз при изменении блока #main_frame
    // Это нужно для того чтобы переинициализировать виджеты
    this.widgets = [];

    this.run = function () {
        console.log("manager runned ...");
        w_blocks = $('.widget');
        for(i in this.widgets) {
            delete this.widgets[i];
            this.widgets[i] = 0;
        }
        this.widgets = [];
        for (var i = 0; i < w_blocks.length; i++) {
            $(w_blocks[i]).attr('w_id', i);
            var options = ($(w_blocks[i]).attr('options'));
            options = (options == undefined || options =="") ? ",{}" : "," + options;
            var call_str = "new " + $(w_blocks[i]).attr('widget') + "('[w_id=" + i + "]'" + options + ")";
            console.log(call_str);
            this.widgets[i] = eval(call_str);
        }
    };
};
Ответить с цитированием
  #17 (permalink)  
Старый 12.02.2015, 10:39
Интересующийся
Отправить личное сообщение для OlegUP Посмотреть профиль Найти все сообщения от OlegUP
 
Регистрация: 12.02.2015
Сообщений: 20

Примерный вывод
manager runned ...
new ObjectsList('[w_id=0]',{'filters': {'need_fields': False}})
Ответить с цитированием
  #18 (permalink)  
Старый 12.02.2015, 11:04
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
Никакой не через жопу, все в соответствии с ооп на javascript, если ты не знаком с этим то не надо тут кричать что все через жопу
Я не понял, ты хочешь помощи или повыпендриваться? Я-то как раз прекрасно знаю, как делается ООП в JS, иначе б я тут не сидел.

Цитата:
for(i in this.widgets) {
Не итерируй так массивы.

Цитата:
Manager = function() {
w_blocks = $('.widget');
Объявление без var/let в современной спецификации JS запрещено. Переключись в строгий режим - код сразу перестанет работать.

Цитата:
eval(call_str);
Лучше не используй eval, когда без него можно обойтись. Выполняемый через него код не может быть пропущен через оптимизатор, что рано или поздно приведет к серьезным лагам.

Цитата:
а вопрос простой и повторю его еще раз: почему после очистки массива хендлеры остаются
Цитата:
Потому что, очевидно, с самих элементов ты ссылки на обработчики не снимаешь.
Ответить с цитированием
  #19 (permalink)  
Старый 12.02.2015, 11:32
Профессор
Отправить личное сообщение для caetus Посмотреть профиль Найти все сообщения от caetus
 
Регистрация: 23.09.2014
Сообщений: 197

может я что то не понимаю но спрошу !
зачем делать вот так ??

delete this.widgets[i]; /// undefined
this.widgets[i] = 0; /// теперь undefined меняешь на 0
this.widgets = []; // и тут полностью очищаешь массив !

покажи как ты вешаешь события и удаляешь !!
Ответить с цитированием
  #20 (permalink)  
Старый 12.02.2015, 11:36
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Все правильно понимаешь, ерунду он делает.
Тем более что через delete элементы массива удалять нельзя.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Еще раз о перелистывании digital_sword jQuery 14 27.05.2010 22:20
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 14:37