Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Не работает push! Динамическая вставка (https://javascript.ru/forum/extjs/29548-ne-rabotaet-push-dinamicheskaya-vstavka.html)

TSEH25 02.07.2012 19:19

Не работает push! Динамическая вставка
 
Ребята спасайте, 5 день мучаюсь!!!
Ext.define("App.module.Calendar", {
    extend : "Ext.grid.Panel",

    requires : ["App.models.System", 'App.models.WorkType'],

    store : null,
    title : 'Календарь',
    iconCls : "calendar16",
    id: 'tsl',
    dockedItems: [],

    initComponent : function () {

        this.dockedItems = [
            {
                xtype:'toolbar',
                id: 'ttl',
                dock:'top',
                renderTo: document.body,
                items:[ Какой то код и выдов me.head1()]
            }
        ],

    head1 : function () {
        this.dockedItems.push(Ext.create('Ext.grid.Panel', {
            columns: [
                { header: '<b>Кол-во работ :</b>',  dataIndex: 'name' },
                { header: '<b>2</b>', dataIndex: 'email', width : 27, align: 'center' },
                { header: '<b>5</b>', dataIndex: 'phone', width : 27, align: 'center' },
                { header: '<b>0</b>', dataIndex: 'phone', width : 27, align: 'center' }
            ]
            //renderTo: Ext.getBody()
        }))
           }


       )


    },

Когда я в initComponent делаю this.dockedItems.push все соответственно работает, но когда в head1, ни чего не работает!!
Вопрос почему push не работает в функции head1? (this.dockedItems.push is not a function)
add ошибок вроде не выдает, но ничего не изменяется. Может нужен рендер? как его реализовать?
this.dockedItems.items.push в head1 тоже ошибок не дает, но нечего не меняет!
insert вставляет, но просто полоску(грид не работает, даже если явно указать ширину и высоту, будет просто квадрат)!!
Как можно вставить грид? выручайте ребята!

DjDiablo 02.07.2012 19:44

Какого хрена me.head1() у тебя делает в items если он нечего не возвращает.

И где обьявлен me ???

items:[ Какой то код и выдов me.head1()] - эту строчку надо бы поподробнее расписать

TSEH25 03.07.2012 00:47

var me = this

это выше, я просто не указал, судь не в этом, главное что функция вызываеться, в items есть combobox, там linester:select вызывает head1

ты намекаешь на то что надо добавить return в head1?

DjDiablo 03.07.2012 07:01

Судя по этому пример items:[ Какой то код и выдов me.head1()]
me.head1() - находитя внутри обьявления массива. Обычно когда вставляют вызов функции в массив пдразумевают что она вернёт в него значение.
z=[  f(1), f(2) ];
function f(x){  return x*10; }
alert(z);//10,20

Странно в объявление массива, вставлять вызов функции просто так :D

Внутри функции head1, что то не так со свойством this.dockedItems. This получен из me, что не так с me? "это выше, я просто не указал," где выше ? Может me вообще перед define указан. Чего ещё нет в примере?

Короче инфы мало, нужен код, ты помоему всё самое интересное опустил :)

ЗЫ. Навсякий случай я попробывал воспроизвести ошибку.
this_={
  dockedItems:{ push:"1"}, //вместо функции у нас будет какая-то непонятная фигня :)
  t:[] // обьявим массив
};
this_.t.push="1";      
//this_.dockedItems2.push (10);// this_.dockedItems2 is undefined (firefox) это не то
//this_.dockedItems.push (10);//this_.dockedItems.push is not a function (firefox)
// this_.t.push(1);  // this_.t.push is not a function  (firefox)
this_.dockedItems.push2 (10);// this_.dockedItems.push2 is not a function (firefox)

TSEH25 03.07.2012 11:43

Вложений: 1
Ext.define("App.module.Calendar", {
    extend : "Ext.grid.Panel",

    requires : ["App.models.System", 'App.models.WorkType'],

    store : null,
    title : 'Календарь',
    iconCls : "calendar16",
    id: 'tsl',
    dockedItems: [],

    initComponent : function () {
        var me = this;
        this.dockedItems = [
            {
                xtype:'toolbar',
                id: 'ttl',
                dock:'top',
                renderTo: document.body,
                items:[
                        [Ext.create('Ext.form.ComboBox', {
                        store : Ext.create('Ext.data.Store', {
                            model : 'App.models.System'
                        }),
                        displayField : 'name',
                        valueField : 'id',
                        typeAhead : true,
                        editable:false,
                        triggerAction : 'all',
                        pageSize: 24,
                        emptyText : 'Выбор системы...',
                        width : 300 ,
                        listeners : {
                            select : function () {
                                me.store.proxy.extraParams['system_id'] = records[0].get('id')
                                me.store.load(
                                function() {
                                this.each(function() {
                                тут я получаю масив...
                                });
                            me.head1() // вот тут вызов head1 после того как получен масив
                        }

                        );

                        }
                        }
                        })]

                    ,{
                        xtype : 'button',
                        text : 'Показать все наименования',
                        handler : function () {
                            me.store.load()
                        }
                    }
                ]
            }
        ]
},

    head1 : function () {
// эта функция должна вставить grid в под combobox и между другим гидом, после того как произойдет событие select в combobox.
 this.dockedItems.push(Ext.create('Ext.grid.Panel', {
            columns: [
                { header: '<b>Кол-во работ :</b>',  dataIndex: 'name' },
                { header: '<b>2</b>', dataIndex: 'email', width : 27, align: 'center' },
                { header: '<b>5</b>', dataIndex: 'phone', width : 27, align: 'center' },
                { header: '<b>0</b>', dataIndex: 'phone', width : 27, align: 'center' }
            ]
            


    }

DjDiablo 03.07.2012 13:00

me.head1() - срабатывает тогда когда срабатывает select. Тоесть на этот момент, обьект на который указывает this уже давно создан. После того как обьект создан метаться поздняк :D, то есть запихнуть в dockedItems как в массив уже нечего не получится. Судя по всему массив dockedItems заменяется обьектом после отработки функции initComponent. Это обьясняет почему в dockedItems нет функции push, хотя само свойство существует.

Должно быть другое решение, просто в контейнер можно было через add добавить,

//просто пример, это может быть не обязательно тулбар
tb = new Ext.toolbar.Toolbar({
    renderTo: document.body
});  
tb.add([{text:'Button 1'}, {text:'Button 2'}]);

а вот в докед итемс неприходилось, попробую посмотреть как до дома добирусь.
Но думаю можно попробывать panel.addDocked({ ... });


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