Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Data Binding для вида Ext.grid.property.Grid (https://javascript.ru/forum/extjs/55611-data-binding-dlya-vida-ext-grid-property-grid.html)

khusamov 06.05.2015 20:49

Data Binding для вида Ext.grid.property.Grid
 
Здравствуйте!

Пытаюсь связать данных из модели с таблицей propertygrid. Сам биндинг работает, заголовок таблицы выводится. А вот содержимое таблицы почему-то не выводится.

Как это исправить?

Код в песочнице https://fiddle.sencha.com/#fiddle/me0

Ext.onReady(function() {

Ext.define('TestViewModel', {
    extend: 'Ext.app.ViewModel',

    alias: 'viewmodel.test', 

    data: {
        title: "Биндинг работает",
        source: {
            '(name)': 'Property Grid',
            grouping: false,
            autoFitColumns: true,
            productionQuality: true,
            created: new Date(),
            tested: false,
            version: 0.8,
            borderWidth: 2
    	}
    }
});    
    
    
Ext.define('TestView', {
    extend: 'Ext.grid.property.Grid',
    
    

    viewModel: {
        type: 'test'  
    },

    bind: {
        title: '{title}',
        source: '{source}'
    }

    
});    

    
    Ext.create('TestView', {
        renderTo: Ext.getBody(),
        width: 400
    });
    
});

novikov 07.05.2015 12:18

Дык, во вьюмодели нужно наверное указать стор. PropertyGrid использует PropertyStore:

// Create a property.Store from the source object unless configured with a store
        if (!me.store) {
            me.propStore = me.store = new Ext.grid.property.Store(me, me.source);
        }


http://docs.sencha.com/extjs/5.1/5.1...-initComponent

Хотя нет. Не в этом дело.

novikov 07.05.2015 12:37

А это, оказывается, известный баг:

https://www.sencha.com/forum/showthread.php?300024

khusamov 07.05.2015 12:52

Баг? Ну ясно... ладно, сам подправлю позже. А почему они не дают доступ к своему форуму? Ужа давно хочу туда попасть. Читать можно, писать - нет прав доступа.

khusamov 07.05.2015 13:27

Вот такая версия работает:

Код в песочнице: https://fiddle.sencha.com/#fiddle/me0

Теперь вопрос, как связаться с sourceConfig?

Ext.onReady(function() {

    Ext.define('TestViewModel', {
        extend: 'Ext.app.ViewModel',
    
        alias: 'viewmodel.test', 
    
        data: {
            title: "Биндинг работает",
            source: {
                    created: Ext.Date.parse('10/15/2006', 'm/d/Y'),
                    available: false,
                    version: 0.01,
                    description: "A test object"
            },
            sourceConfig: {
                created: {displayName: "Создано"},
                available: {displayName: "Доступно"},
                version: {displayName: "Версия"},
                description: {displayName: "Описание"}
            }
        }
    });    
        
        
    Ext.define('TestView', {
        extend: 'Ext.grid.property.Grid',
        
        viewModel: {
            type: 'test'  
        },
    
        bind: {
            title: '{title}',
            //source: '{source}'
            
            source: {
                    created: "{source.created}",
                    available: "{source.available}",
                    version: "{source.version}",
                    description: "{source.description}"
                }
        }
    });    
    
    Ext.create('TestView', {
        renderTo: Ext.getBody(),
        width: 400
    });
    
});

khusamov 14.05.2015 22:21

Чтобы связать sourceConfig пришлось делать производный класс. Но он тоже не работает из-за вышеупомянутого бага.

khusamov 14.05.2015 23:05

В общем выкрутился вот таким способом:

currentSource: Ext.define("random" + Math.random(), {
			data: {
				created: Ext.Date.parse('10/10/2006', 'm/d/Y'),
				available: false,
				version: 0.01,
				description: "A test object"
			},
			config: {
				created: {
					displayName: "Создано"
				},
				available: {
					displayName: "Доступно"
				},
				version: {
					displayName: "Версия"
				},
				description: {
					displayName: "Описание"
				}
			}
}).prototype



1) для учета sourceConfig придется создавать производный класс
2) для того, чтобы биндились объекты придется объекты оборачивать в

Ext.define("random" + Math.random(), {<здесь сам объект>}).prototype


либо вместо такой обертки можно сделать специальный класс и оборачивать в него, а не плодить толпу таких вот времянок.

Это до поры пока не исправят багу.

П.С. Пробовал оборачивать в new Object() - не помогло. Часть членов ломаются все равно. Если есть по-экономнее обертка - прошу сообщить)


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