Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 03.11.2016, 09:42
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

XAPuTOH, Сделал по примеру того как Вы написали. Вот код на редактирование:
onEdit: function(view, cell, rowIndex, colIndex, e, rec, row) {
    console.log(rec);

    var form = new MyApp.view.dictionaries.positions.PositionsForm({
        viewModel: {
            data: {
                title: 'Редактирование'
            }
        }
    });

    console.log(form);

    form.loadRecord(rec);

    form.show();
},


Форма показывается, заполняется и даже отправляется куда надо, но при этом если мы жмем "Сохранить" без редактирования, то в request'е уходит лишь id! Т е получается у нас значения уходят на сервер лишь при изменении.
Как Вы этот момент отлавливаете?

Еще почему-то у меня два PUT'а на сервер уходят вместо 1го...я так понимаю, что тут проблема в том, что после updateRecord идет сразу record.save и получается 2 одинаковых действия. Если мы убираем record.save, то уже нет проблемы отправки пустой записи и форма просто закрывается на "Сохранить".

Можете также выложить ф-цию `this.formSave`и объяснить момент со вставкой?

p.s. Этот код не сработает никогда:
} else {
            Ext.Msg.alert('Некорректные данные', 'Введите корректные данные');
        }


Потому что в форме прописано на кнопке "Сохранить" вот это:
formBind: true,
disabled: true,


У пользователя нет никакой возможности нажать на кнопку, которая отключена =)

Последний раз редактировалось Sogl, 03.11.2016 в 09:53.
Ответить с цитированием
  #12 (permalink)  
Старый 08.11.2016, 10:06
Аватар для Sogl
Аспирант
Отправить личное сообщение для Sogl Посмотреть профиль Найти все сообщения от Sogl
 
Регистрация: 12.05.2016
Сообщений: 95

В общем, унифицированной универсальной формы не получилось. Получилось некое её подобие.

Дело в том, что мне вставка новой записи нужна именно через Store, иначе событие write, которое показывает всплывающие toast-сообщения, не отрабатывает. А к Store, который может быть любым, неизвестно каким образом вообще обращаться из этой формы.

То, что `record.save()` не связано с обновлением хранилища писали еще тут:
Вызов record.save() не обновляет pagingtoolbar и не меняет фантомный id на реальный

Вот такая форма:
Ext.define('MyApp.view.helpers.Baseform', {
    extend: 'Ext.form.Panel',
    xtype: 'baseform',
    controller: 'baseform',

    bind: {
        title: '{editformTitle}'
    },

    layout: {
        type: 'vbox',
        align: 'stretch'
    },

    bodyPadding: 10,
    border: false,

    width: 400,
    modal: true,
    closable: true,
    closeToolText: 'Закрыть',
    floating: true,
    reference: 'form',
    buttons: [
        {
            formBind: true,
            disabled: true,
            text:'Сохранить',
            handler:'save'
        },
        {
            text: 'Отменить',
            handler: function(){
                this.up('form').close();
            }
        }
    ]
});


Ее контроллер. Тут я проверяю id на целое число. Если целое, то у нас редактирование, если нет, то это новая запись. Также я сам record передаю при вызове события:
Ext.define('MyApp.view.helpers.BaseformController', {
    extend: 'Ext.app.ViewController',
    alias: 'controller.baseform',

    save: function() {
        var me = this,
            form = this.view,
            record = form.getRecord();

        // console.log(record);

        if (form.isValid()) {

            var id = record.getId();

            var values = form.getValues();
            // console.log(values);


            //check if edit
            if (Ext.isNumber(id)) {

                record.beginEdit();
                record.set(values);
                record.endEdit();

            } else {

                record.set(values);
                form.fireEvent('insertNew', record);
            }

            form.close();
        }
    }

});


Обработчики добавления, редактирования и создания формы:
onAdd: function() {
    console.log('onAdd');

    var record = Ext.create('MyApp.model.dictionaries.positions.Positions');
    console.log(record);

    this.createForm(record, true);
},

onEdit: function(view, cell, rowIndex, colIndex, e, rec, row) {
    this.createForm(rec, false);
},


createForm: function(record, stateNew) {
    // console.log(record);

    var form = new MyApp.view.dictionaries.positions.PositionsForm({
        viewModel: {
            data: {
                editformTitle: stateNew ? 'Добавление' : 'Редактирование'
            }
        }
    });

    // console.log(form);

    form.loadRecord(record);
    form.on('insertNew', this.formInsertNew, this);
    form.show();
},


А вот обработчик события вставки:
formInsertNew: function(record) {
    console.log('NEW RECORD!!!!');
    console.log(record);

    var store = this.getView().getStore();
    store.insert(0, record);
}


Обновляю я store в событии `write`, там же вывожу toast-сообщение.

Да, есть неудобный костыль с обращением к store, но пока иного решения не нашел.

Буду признателен, если кто-нибудь из форумчан даст ответы на эти вопросы:
  1. Каким образом можно передать Store или ссылку на него при создании формы и обращаться к нему уже в её контроллере?
  2. Можно ли записать вот эту конструкцию иначе?
    record.beginEdit();
    record.set(values);
    record.endEdit();
    
  3. Каким образом при extend'е формы добавить поля во вложенный(!) component с xtype: form? Я хочу основу сделать на Window, а форма будет уже внутри него.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
REST API для сайта на Node js Ashotich Node.JS 2 26.09.2016 23:04
Rest api server(php), кроссдоменные запросы и клиенты на чем угодно torsar Серверные языки и технологии 0 06.05.2016 15:58
rest api client z2312 AJAX и COMET 0 20.01.2015 11:53
Отменить submit формы при нажатии enter MaxStoun Events/DOM/Window 5 07.04.2011 19:00
Как создать проверку вводимого пароля на стойкость, используя API Google. Александр Черепов Элементы интерфейса 4 03.11.2008 02:16