Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 27.02.2013, 12:08
Новичок на форуме
Отправить личное сообщение для Stakantin Посмотреть профиль Найти все сообщения от Stakantin
 
Регистрация: 27.02.2013
Сообщений: 5

не вижу вариантов получения названия объекта для вызова его функции
Здравствуйте!
Вобщем такая проблема:
пытаюсь создать свой собственный грид (функция возвращающая объект, с данными для отрисовки и сортировки их в таблице)

var realGrid = function(GridSettings){
    var grid = new Object();
    var tmp;
    grid.id = GridSettings.id;
    grid.data = GridSettings.data;
    grid.idOfDrawPlace = document.getElementById(GridSettings.idOfDrawPlace);
    grid.FLP = new Array();             //FLP = first lvl propertys
    if(GridSettings.indToString){
        tmp = 0;
        for(var p in GridSettings.data[0]){
            grid.FLP[tmp] = new Object();
            grid.FLP[tmp].ind = p;
            grid.FLP[tmp].sortUp = true;
            for(var i=0; i < GridSettings.indToString.length; i++){
                for(var q in GridSettings.indToString[i]){
                    if(p==q){
                        grid.FLP[tmp].name = GridSettings.indToString[i].name;
                        grid.FLP[tmp].dt = GridSettings.indToString[i].dt;
                        break;
                    }
                    else{
                        grid.FLP[tmp].name = grid.FLP[tmp].ind;
                        grid.FLP[tmp].dt = "str";
                    }
                }
            }
            tmp++;
        }
    }
    else{
        tmp = 0;
        for(var p in GridSettings.data[0]){
            grid.FLP[tmp] = new Object();
            grid.FLP[tmp].ind = p;
            grid.FLP[tmp].sortUp = true;
            grid.FLP[tmp].name = p;
            grid.FLP[tmp].dt = "str";
            tmp++;
        }
    }
    grid.draw = function(){
        var htmlStr = '<table id="tab'+grid.id+'">';
        for(var i = 0; i < this.FLP.length; i++){
            htmlStr += '<th onclick="this.sortBy('+i+')\;">'+
                this.FLP[i].name+'</th>';
        }
        for(var i =0; i < this.data.length; i++){
            htmlStr += '<tr>';
            for(var p = 0; p < this.FLP.length; p++){
                htmlStr += '<td>'+this.data[i][this.FLP[p].ind]+'</td>';
            }
            htmlStr += '</tr>';
        }
        htmlStr += '</table>';
        this.idOfDrawPlace.innerHTML = htmlStr;
    }
    grid.clean = function(){
        this.idOfDrawPlace.innerHTML = "";
    }
    grid.sortBy = function (ind){
        this.nowSortBy = this.FLP[ind].ind;
        this.nowSortType = this.FLP[ind].dt;
        if(this.FLP[ind].sortUp){
            this.data.sort(this.sortRuleUp);
        }
        else{
            this.data.sort(this.sortRuleDown);
        }
    }
    grid.sortRuleUp = function(a,b){
        switch (this.nowSortType){
            case "str":
                if(a[this.nowSortBy] < b[this.nowSortBy]){
                    return -1;
                } else if (a[this.nowSortBy] > b[this.nowSortBy]){
                    return 1;
                } else return 0;
                break;
            case "num":
                if(a[this.nowSortBy]-0 < b[this.nowSortBy]-0){
                    return -1;
                } else if (a[this.nowSortBy]-0 > b[this.nowSortBy]-0){
                    return 1;
                } else return 0;
                break;
            default: return 0; break;
        }
    }
    grid.sortRuleDown = function(a,b){
        switch (this.nowSortType){
            case "str":
                if(a[this.nowSortBy] > b[this.nowSortBy]){
                    return -1;
                } else if (a[this.nowSortBy] < b[this.nowSortBy]){
                    return 1;
                } else return 0;
                break;
            case "num":
                if(a[this.nowSortBy]-0 > b[this.nowSortBy]-0){
                    return -1;
                } else if (a[this.nowSortBy]-0 < b[this.nowSortBy]-0){
                    return 1;
                } else return 0;
                break;
            default: return 0; break;
        }
    }
    return grid;
}


проблема обнаружилась в создании события onclick в тэгах th для сортировки таблицы (и в т.ч. массива) по заданному полю.
т.к. переменная которая получит результат грида заранее неизвестна,
поэтому и слудеющая часть кода ошибочна (в функции .draw):
htmlStr += '<th onclick="this.sortBy('+i+')\;">'+.......

как можно повесить на onclick вызов функции sortBy, если при этом она принадлежит неизвестному объекту?

P.S. функция грид принимает объект со следующими настройками:

var Obj = new Object();       // создаем объект
Obj.data                            // сюда кладем массив с объектами
Obj.idOfDrawPlace               // id тэга куда врисовать таблицу
Obj.colInfo = new Array();    // массив с данным о колонках
Obj.colInfo[0].ind;               // свойство объекта
Obj.colInfo[0].name;          // расшифровка свойства полным словом
Obj.colInfo[0].dt;             // data type (тип данных) либо "str либо "num"
................................. // и так далее для каждой колонки 
                                 //будущей таблицы
Obj.id;                         //уникальный id грида
Ответить с цитированием
  #2 (permalink)  
Старый 27.02.2013, 12:22
Новичок на форуме
Отправить личное сообщение для Stakantin Посмотреть профиль Найти все сообщения от Stakantin
 
Регистрация: 27.02.2013
Сообщений: 5

еще одно уточнение, желательно решить проблему без создания каких либо функций и переменных вне объекта grid
Ответить с цитированием
  #3 (permalink)  
Старый 27.02.2013, 12:28
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,889

Stakantin, начни с простого тестового примера и на нём покажи что тебе хочется получить.
Иначе мало кого заинтересуешь...
Ответить с цитированием
  #4 (permalink)  
Старый 27.02.2013, 12:45
Новичок на форуме
Отправить личное сообщение для Stakantin Посмотреть профиль Найти все сообщения от Stakantin
 
Регистрация: 27.02.2013
Сообщений: 5

вобщем нашел что меня интересует но видать подход не правильный
возможно узнать имя объекта из самого объекта?

если все сильно упростить то надо сделать следующее:

var gridGenerator = function(idOfPlaceForDraw){ //idOfPlaceForDraw это id тэга куда добавятся данные
    var grid = new Object();
    grid.data = new Array(1,2,3,9,8,7);
    grid.placeForDraw = document.getElementById(idOfPlaceForDraw);
    grid.sorting = function(){
        this.data.sort();
        this.draw();
    }
    grid.draw = function(){
        this.placeForDraw.innerHTML = ""; //очищаем содержимое тэгов элемента от всего вложенного внутрь
        this.placeForDraw.innerHTML += '<input type="button" value="Sort and refresh" onclick="">'; //Вот это меня и интересует
        //как добавить сюда - в событие onclick вызов функции у именно этого объекта???
        //т.е. должно быть наподобии onclick="this.sorting();"
        for(var i = 0; i < this.data.length; i++){
            this.placeForDraw.innerHTML += this.data[i];
        }
    }
}


далее:

var someNewTable = gridGenerator;
// т.е. неизвестно заранее название переменной в которую будет получен объект grid
//и не возможно заранее вписать: onclick="someNewTable.sorting();"
Ответить с цитированием
  #5 (permalink)  
Старый 27.02.2013, 12:48
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,889

Сообщение от Stakantin
если все сильно упростить то надо сделать следующее
Нужно делать не огрызки... А нечто законченое. Дабы другие могли это запустить и тебе показать как сделать.
Ответить с цитированием
  #6 (permalink)  
Старый 27.02.2013, 12:51
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,889

Сообщение от Stakantin
как добавить сюда - в событие onclick вызов функции у именно этого объекта?
Как вариант в помощь
http://learn.javascript.ru/bind
Ответить с цитированием
  #7 (permalink)  
Старый 27.02.2013, 12:57
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 12,889

Если я тебя правильно понял...
У тебя есть:
- функция
- объект
Нужно в нутри функции обратиться к методу объекта...

function f() {
  this.m();
}
var obj={
	name: "Вася",
	m: function(){
		alert(this.name);
	}
}
test = f.bind(obj);
test();

bind() не работает в старых версиях ИЕ...
Ответить с цитированием
  #8 (permalink)  
Старый 27.02.2013, 13:06
Новичок на форуме
Отправить личное сообщение для Stakantin Посмотреть профиль Найти все сообщения от Stakantin
 
Регистрация: 27.02.2013
Сообщений: 5

проблему решил
Ответить с цитированием
  #9 (permalink)  
Старый 27.02.2013, 13:10
Новичок на форуме
Отправить личное сообщение для Stakantin Посмотреть профиль Найти все сообщения от Stakantin
 
Регистрация: 27.02.2013
Сообщений: 5

Позже скину решение...
решил с помошью объекта window
подробности чуть позже.

кстати видать я совсем неверно описал проблему =\
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сформировать URL для вызова функции klingan Общие вопросы Javascript 13 25.04.2013 19:55
Перехват функции подгрузки контента для его изменения deivan Events/DOM/Window 3 19.11.2012 15:23