Javascript.RU

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

Мозговой штурм !!!! Построение иерархической модели данных.
Всем доброго времени суток.

Есть
элементы с классом column в них вложены элементы с классом portlet, в portlet вложены элементы с классом column, а в этот новый column снова portlets и так как угодно много.

стоит задача превратить всю эту абракадабру в дерево данных и хранит в обьекте.
Должно получится что то вроде

........................колумн
......................./
............портлет- колумн
........../............\
колумн ..............колумн
..........\
...........портлет

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

в результате всего должен получится аналог UI sortable
Но с возможностью размещать ёмкости для портлетов(.column) внутри портлетов, к сожалению ui sortable глубокую вложенность не поддерживает.

Пытаюсь реализовать создание дерева методом рекурсии.

function trackman (obj,type){  //рекурсивная функция обходчик.
    this.link=obj; //ссылка на элемент DOM для каких нибудь манипуляций с ним   
    this.name=$(obj).attr("id");  // ID портлета или column  
    this.subject=[];                 // обьявляем массив в котором храним дочерние обьекты.
    self=this;                         // делаем ссылку на контекст чтобы использовать его  внутри  each
    if (type==1){ // если изучаем column, тоесть ищем портлеты
        jQuery.each($(obj).find(">.portlet"), function(){            
            self.subject.push(new trackman(this,-1));            //вызываем обходчик для каждого найденного портлета
        });         
    } else {      //если изучаем portlet, тоесть ищем column                
        jQuery.each($(obj).find(".column:not(.column .column)"), function(){                                                                   
            self.subject.push(new trackman(this,1));             //вызываем обходчик для каждого найденного column                                    
        });
    }                          

//функция строительства дерева
function arrangerRefrash(){
var i=0;
jQuery.each($(".wrpage> .column"),function(){ // перебираем все column    
   arrObj[i]=new trackman (this,1)                           
   i=i+1;            
});
}


но нофига невыходит, так как вместо массива с портлет я получаю portlets вложенные друг в друга.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 30.08.2011 в 20:15.
Ответить с цитированием
  #2 (permalink)  
Старый 30.08.2011, 20:18
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

только сейчас пришла идея, заменить $.each на обычный for, это позволит упростить код и избавится от захвата контекста в self. Но не уверен что это как то поможет ))))))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #3 (permalink)  
Старый 30.08.2011, 20:20
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

А вложенные друг в друга portlet и column Вас, судя по коду, не интересуют, верно я понял?

Оффтоп: не понял Вашу подпись Ни первую её мысль, ни вторую...

Последний раз редактировалось popov654, 30.08.2011 в 20:33.
Ответить с цитированием
  #4 (permalink)  
Старый 30.08.2011, 20:26
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Portlet может находится только внутри column
Column'ы только внутри portlet.

Portlet не может находится внутри portlet непосредственно.
Портлет можно разместить только в контейнере column. А вот уже column находится в каком нибудь портлете.

Пример
мы имеем column во всю страницу.
1)Пользователь пераскивает в него портлет "текст". и пишет большими буквами заголовок.
2) Затем он перетаскивает ниже текста портлет "Layer", внутри которого есть 3 column- левый,центральный,и правый. как при стандартной разметки страницы
3) пользователь заполняет column'ы портлетами с контентом.

Вот собственно откуда вложенность.

офтоп: как то нехочется обьяснять свой статус буквально )). Спросите у майкрософта ))).
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 30.08.2011 в 20:46.
Ответить с цитированием
  #5 (permalink)  
Старый 30.08.2011, 20:32
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

А, ну тогда всё логично)
Ответить с цитированием
  #6 (permalink)  
Старый 30.08.2011, 20:56
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Сообщение от popov654 Посмотреть сообщение
А, ну тогда всё логично)
Это сарказм ?.
или это логично но не работает ))))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Ответить с цитированием
  #7 (permalink)  
Старый 30.08.2011, 21:16
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

А вот это вот похоже работает.

function trackman (obj,type){      
    this.link=obj;                      //ссылка на обьект для манипуляция.
    this.name=$(obj).attr("id");   //сохраняем id  
    this.subject=[];                  //здесь храним вложенные обьекты
    if (type==1){ // если изучаем column, тоесть ищем портлеты
        finder=$(obj).find(">.portlet");  //делаем выборку
        length=finder.length;              // определяем длинну выборки
        
        for (i=0;i<length;i++){            // перебираем выборку в цикле                   
            this.subject.push(new trackman(finder[i],-1));     // передаём в рекурсию            
       }                                                  
        console.log(this); //показываем в логе что у нас получилось
                              
    } else {      //если изучаем portlet, тоесть ищем column                
        jQuery.each($(obj).find(".column:not(.column .column)"), function(){ // здесь пока на FOR не менял, но поменяю                                                                  
            self.subject.push(new trackman(this,1));                                                
        });//*/                                  
    }                          
}

function arrangerRefrash(){
var i=0;
jQuery.each($(".wrpage> .column"),function(){ // перебираем все column    
   arrObj[i]=new trackman (this,1)  ;                         
   i=i+1;            
});
}


Значит проблема была в контексте сохранённом в self, хотя механизьм это проблемы я так до конца и не понял. Всё равно спасибо, недогнал пока не написал на форум. )))
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 30.08.2011 в 21:24.
Ответить с цитированием
  #8 (permalink)  
Старый 30.08.2011, 23:39
Профессор
Отправить личное сообщение для popov654 Посмотреть профиль Найти все сообщения от popov654
 
Регистрация: 22.09.2010
Сообщений: 217

Цитата:
Это сарказм ?.
Да Боже упаси) Просто пытался написать что-нибудь по делу. Я вообще jQuery ещё не изучал

Цитата:
Спросите у майкрософта )))
Очень смешно
Ответить с цитированием
  #9 (permalink)  
Старый 31.08.2011, 09:16
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

Сообщение от DjDiablo
Есть
элементы с классом column в них вложены элементы с классом portlet, в portlet вложены элементы с классом column, а в этот новый column снова portlets и так как угодно много.

стоит задача превратить всю эту абракадабру в дерево данных и хранит в обьекте.
У нас объектноориентированая СУБД... Сделал бы хранение в двух табличках/объектах

column
Код
Код-ссылка на экземпляр в portlet
Другие поля


portlet
Код
Код-ссылка на экземпляр в column
Другие поля

Последний раз редактировалось ksa, 31.08.2011 в 09:18.
Ответить с цитированием
  #10 (permalink)  
Старый 31.08.2011, 13:10
Аватар для kadabrik
Кандидат Javascript-наук
Отправить личное сообщение для kadabrik Посмотреть профиль Найти все сообщения от kadabrik
 
Регистрация: 10.12.2010
Сообщений: 114

ksa дело говорит, храни все не в иерархическом, а в релиационном виде, алгоритмы будут проще, а скорость в разы выше.
Ответить с цитированием
Ответ



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

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