не вижу вариантов получения названия объекта для вызова его функции
Здравствуйте!
Вобщем такая проблема: пытаюсь создать свой собственный грид (функция возвращающая объект, с данными для отрисовки и сортировки их в таблице)
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 грида
|
еще одно уточнение, желательно решить проблему без создания каких либо функций и переменных вне объекта grid
|
Stakantin, начни с простого тестового примера и на нём покажи что тебе хочется получить.
Иначе мало кого заинтересуешь... |
вобщем нашел что меня интересует но видать подход не правильный
http://javascript.ru/forum/extjs/117...go-obekta.html если все сильно упростить то надо сделать следующее:
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();" |
Цитата:
|
Цитата:
http://learn.javascript.ru/bind |
Если я тебя правильно понял...
У тебя есть: - функция - объект Нужно в нутри функции обратиться к методу объекта...
function f() {
this.m();
}
var obj={
name: "Вася",
m: function(){
alert(this.name);
}
}
test = f.bind(obj);
test();
bind() не работает в старых версиях ИЕ... |
проблему решил :D
|
Позже скину решение...
решил с помошью объекта window подробности чуть позже. кстати видать я совсем неверно описал проблему =\ |
| Часовой пояс GMT +3, время: 06:40. |