bindTo
Terrasoft.TextEdit
value
Технические вопросы
7.x

Не работает bindTo свойства value для компонента Terrasoft.TextEdit

Почему может не работать binding? Кто-нибудь сталкивался с таким?
Сделал тестовый модуль, в нем:
1. В модели определил свойства и обработчик кнопки выбора ответственных:

                values: {
                        ownerIds: '',
                        ownerNames: ''
                },
                methods: {
                        onChooseOwnerBtnClick: function() {
                                var config = {
                                        entitySchemaName: 'Contact',
                                        multiSelect: true,
                                        columnName: 'Name',
                                        filters: BaseFiltersGenerateModule.OwnerFilter()
                                };
                                var handler = function(args) {
                                        var items = args.selectedRows.getItems() || [];
                                        var s1 = "";
                                        var s2 = "";
                                        for (var i = 0; i items.length; i++) {
                                                if (s1 !== "") {
                                                        s1 = s1 + ",";
                                                        s2 = s2 + "; ";
                                                }
                                                s1 = s1 + "'" + items[i].value + "'";
                                                s2 = s2 + items[i].displayValue;
                                        }
                                        this.set('ownerIds', s1);
                                        this.set('ownerNames', s2);
                                };
                                var keepAlive = true;
                                LookupUtilities.Open(sandbox, config, handler, this, Ext.get('centerPanel'), keepAlive);
                        }
                }

2. В представлении определил кнопку и текстовое поле:

                items: [{
                        className: 'Terrasoft.Container',
                        id: 'byPeriodSettingsControlContainer4',
                        selectors: {
                                wrapEl: '#byPeriodSettingsControlContainer4'
                        },
                        classes: {
                                wrapClassName: ['custom-inline']
                        },
                        items: [{
                                className: 'Terrasoft.Label',
                                caption: 'Owner'
                        }, {
                                className: 'Terrasoft.TextEdit',
                                readonly: true,
                                value: {
                                        bindTo: 'ownerNames'
                                }
                        }, {
                                className: 'Terrasoft.Button',
                                id: 'btnSelectOwner',
                                caption: 'Select',
                                width: '80px',
                                style: Terrasoft.controls.ButtonEnums.style.DEFAULT,
                                click: {
                                        bindTo: 'onChooseOwnerBtnClick'
                                }
                        }]

Все работает без ошибок, под отладчиком срабатывает обработчик и присваивает свойствам модели значения, но на экране в текстовом поле пусто.

Причем пробовал и со схемой OpenCustomModule.md из недавнего цикла уроков - там тоже bindTo для кнопки работает, а для текстового поля - нет. В том смысле что код отрабатывает нормально, но текстовое поле не отображает изменение значения модели.

Нравится

7 комментариев

Спасибо за Ваше обращение. Мы зарегистрировали его в Службе технической поддержки и назначили специалиста, который сможет Вас компетентно проконсультировать по данному вопросу

Здравствуйте, Валерий!
Биндинг должен работать по колонкам. То есть в модели представления должны быть колонка "ownerNames". Несколько фрагментов кода из базовой конфигурации:

[javascript]
var getViewModel = function() {
return Ext.create('Terrasoft.BaseViewModel', {
columns: {
languageList: {
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
name: 'languageList',
isCollection: true
},
culture: {
type: Terrasoft.ViewModelColumnType.ATTRIBUTE,
name: 'culture',
isRequired: true
}
},
......

{
className: 'Terrasoft.ComboBoxEdit',
value: {
bindTo: 'culture'
},
list: {
bindTo: 'languageList'
},
prepareList: {
bindTo: 'onPrepareLanguageList'
},
visible: {
bindTo: 'visibleByBuildType'
}
},
.........
var sysCutureId = entity.get('SysCulture.Id');
var sysCutureName = entity.get('SysCulture.Name');
var timeZoneCode = entity.get('TimeZoneId');
var timeZoneId = entity.get(timeZoneIdColumn.columnPath);
var timeZoneName = entity.get(timeZoneNameColumn.columnPath);
viewModel.set('culture', {value: sysCutureId, displayValue: sysCutureName});
[/javascript]

Перенес из секции values в columns, но ничего не поменялось...
[javascript]
columns: {
ownerNames: {
type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
name: 'ownerNames'
}
},
values: {
ownerIds: '',
//ownerNames: '',
gridData: new Terrasoft.BaseViewModelCollection()
},

[/javascript]

Если до binding-а присваивать - то отображается.
[javascript]
viewModel.set('ownerNames', 'aaaaaaaaaaa');
view.bind(viewModel);
view.render(renderTo);

[/javascript]

Если в обработчике после вызова справочника - то не отображается... По крайней мере для TextEdit.

Что еще можно проверить?
Если что, могу удаленно показать...

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

Действительно...:smile:
Прицепил к сообщению.
Версия 7.1.0.172

Здравтсвуйте, Валерий!
Нашел решение. Вот фрагменты кода:

[javascript]
function(Ext, Terrasoft, sandbox, resources, BaseFiltersGenerateModule, LookupUtilities) {
var view, viewModel, ownerNamesValue;
//===============================
values: {
ownerIds: '',
ownerNames: ownerNamesValue,
gridData: new Terrasoft.BaseViewModelCollection()
},
//==============================
var handler = function(args) {
var items = args.selectedRows.getItems() || [];
var s1 = "";
var s2 = "";
//==============================
// так не надо viewModel.set('ownerNames', s2);
ownerNamesValue = s2; //так надо
};
[/javascript]

Спасибо, Андрей, работает!

Показать все комментарии