Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Задать значения вьюмодели при создании компонента. (https://javascript.ru/forum/extjs/59950-zadat-znacheniya-vyumodeli-pri-sozdanii-komponenta.html)

XAPuTOH 04.12.2015 12:09

Задать значения вьюмодели при создании компонента.
 
Всем привет. Наверное глупый вопрос, но чето понять пока не могу

Есть некий компонент Filter.
И есть у него View, ViewModel и ViewController
Примерно так:
Ext.define('FilterPanel', {
    extend: 'Ext.tree.Panel',
    alias: 'Filter',
    controller: 'ViewController',
    viewModel: {
        type: 'ViewModel'
    },

    bind:{
        store:'{filterStore}'
    }
.................


Во вьюхе объявлена вьюмодель и забиндин стор из него.
Вьюмодель примерно такая:
Ext.define('ViewModel', {
    extend: 'Ext.app.ViewModel',

    alias: 'viewmodel.ViewModel',

    data:{
        relTypeId:11,
    },

    stores: {
        Objects: {
            type: 'objects',
            autoLoad:false,
            pageSize:'{pageSize}',
            proxy:{
                extraParams: {
                    relTypeId: '{relTypeId}'
                }
            }
        }
    }
});


В общем мне надо при создании этого компонента както задать relTypeId.

Пытаюсь так:
Ext.Create('Filter',{
     viewModel:{
           data:{ relTypeId: 5}
     }
})


Он у меня перезаписывает всю модель целиком.

Если я при этом укажу тип viewModel. то все нормально:
Ext.Create('Filter',{
     viewModel:{
          type: 'ViewModel'
          data:{ relTypeId: 5}
     }
})


Но помоему это както нелогично и не прозрачно. Есть ещё какието способы задать значение переменной вьюмодели при создании объекта?

novikov 04.12.2015 12:56

Используйте контроллер.

init: function() {
        this.getViewModel().set('relTypeId', 5);
    }


see fiddle

Infarch 04.12.2015 13:43

Цитата:

Сообщение от XAPuTOH (Сообщение 398675)
Но помоему это както нелогично и не прозрачно.

По-моему, как раз логично все. Экст должен знать, какую именно вьюмодель подключить к компоненту. Для этого указываем тип. Далее, вы хотите задать или переопределить некие данные. Опять таки пишете это в конфиге рядом с типом. Все нормально.

XAPuTOH 05.12.2015 06:22

Цитата:

Сообщение от novikov
Используйте контроллер.

Как передать это значение в контроллер прежде чем он изменит viewModel?

Цитата:

Сообщение от Infarch
По-моему, как раз логично все. Экст должен знать, какую именно вьюмодель подключить к компоненту.

У меня уже назначена эта же viewModel в компоненте. И помоему логично менять только значение из модели а не всю модель.

И еще мне кажется что присвоение модели не в компоненте может запутать в дальнейшем.

Infarch 05.12.2015 12:22

В компоненте вы указываете какую именно модель подключить. А при создании компонента вносите в нее переменные данные. Вот посмотрите на фидл https://fiddle.sencha.com/#fiddle/124n

Там вьюмодель имеет строку для заголовка грида и стор. А заголовки колонок прописывыем при создании компонента. Как видите никто ничего целиком не переписывает. Заголовок грида именно тот что прописанн в модели, стор подключился, значит модель подключена правильная. При создании компонента ExtJS мерджит конфиги, так что все нормально.

XAPuTOH 07.12.2015 06:09

Блин. у меня почему то именно так и не работает. Правда у меня компонент treeview и соответственно в модели стор соответствующего типа.
В вашем примере все отлично! именно так и должно быть. попробую тоже сделать пример в fiddle.sencha.com/

XAPuTOH 25.03.2016 12:57

В общем разобрался почему у меня не работало! Мой первый пост немного не правильный.

во вьюхе я объявлял вьюмодель следующим образом:
Ext.define('FilterPanel', {
extend: 'Ext.tree.Panel',
alias: 'Filter',
controller: 'ViewController',
viewModel: 'ViewModel'
}


И все работает отлично. нужная модель подключается.

Но как только я создавал экземпляр вьюхи и в нем явно указывал какие то данные вьюмодели она перезаписывается.

В общем рекомендую явно указывать тип вьюмодели как в моем первом посте.


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