Ir para conteúdo


Foto

Inconsistencia entre Session.getChanges() e Session.getSaveBatch()


  • Por favor, faça o login para responder
1 resposta neste tópico

#1 insanity

insanity

    Iniciante

  • Membros
  • Pip
  • 3 posts

Postado 30 October 2014 - 11:01

Bom dia Pessoal,

        Estava eu brincando com o Ext 5 e dando uma olhada no novo modo de associaçoes manyToMany e finalmente o suporte a sessoes, quando me deparei com um comportamento um tanto estranho a primeira vista, em minhas views, eu habilito o uso de sessoes usando session: true, faço o mesmo no store declarado no meu viewmodel, e os proxies para as entidades estao declarados no meu modelo, basicamente na minha view eu tenho uma grid, ligada a um formulario e outras grids usadas para mostrar as associaçoes de uma linha selecionada na grid principal, mais ou menos como um mestre/detalhe, até ai tudo bem, o problema começa quando eu adiciono/removo uma associaçao, no meu viewController, quando o usuario clica em salvar, utiliso o seguinte codigo de teste:

session = this.getView().getSession();
console.log(session.getChanges());
console.log(session.getSaveBatch());

no primeiro print, tudo parece normal, eu tenho um objeto com a operaçao que foi efetuada na associaçao, ja o segundo print envia undefined ao invez do esperado objeto batch.

aqui vai o meu modelo, irei simplificar o postar apenas as partes essenciais, visto que os outros modelos associados sao apenas modelos sem nada especial:


Base.js
Ext.define('Manager.model.Base', {
    extend: 'Ext.data.Model',
    
    fields: [
        {name: 'id', type: 'auto'}
    ],

    schema: {
        namespace: 'Manager.model',
        urlPrefix: 'http://localhost/manager-server/web/app_dev.php',
        
        proxy: {
            type: 'ajax',

            api: {
                read : '{prefix}/{entityName:lowercase}/list.do',
                create: '{prefix}/{entityName:lowercase}/create.do',
                update: '{prefix}/{entityName:lowercase}/update.do',
                destroy: '{prefix}/{entityName:lowercase}/destroy.do'
            },

            reader: {
                type: 'json',
                rootProperty: 'items'
                //pageParam: '',
                //startParam: '',
                //limitParam: ''
            },

            listeners: {
                exception: function(proxy, response, operation){
                    Ext.MessageBox.show({
                        title: 'Remote Exception',
                        msg: 'Unexpected error: ' + operation.getError().status,
                        icon: Ext.MessageBox.ERROR,
                        buttons: Ext.Msg.OK
                    });

                    console.log(operation.getError());
                }
            }
        }
    }
});

Usuario.js
Ext.define('Manager.model.User', {
    extend: 'Manager.model.Base',
    requires: [
        'Manager.model.Company',
        'Manager.model.Group',
        'Manager.model.Role',
        'Manager.model.ContactType'
    ],
    
    fields: [
        {name: 'firstName', type: 'string'},
        {name: 'lastName', type: 'string'},
        {name: 'email', type: 'string'},
        {name: 'phone', type: 'string'},
        {name: 'login', type: 'string'},
        {name: 'password', type: 'string'}
    ],
    
    manyToMany: [
        'Company',
        'Group',
        'Role',
        'ContactType'
    ]
});

a declaraçao do meu store no viewmodel:

stores: {
        users: {
            model: 'Manager.model.User',
            autoLoad: true,
            session: true
        }
    }

E para finanizar, parte da minha view:

Ext.define('Manager.view.users.List',{
    extend: 'Ext.panel.Panel',
    requires: [
        'Ext.grid.Panel',
        //'Manager.store.User',
        'Manager.view.user.ListController',
        'Manager.view.user.ListModel'
    ],
    
    xtype: 'userlist',
    itemId: 'users',
    
    controller: 'list',
    
    viewModel: {
        type: 'list'
    },
    
    title: 'Users',
    closable: true,
    layout: 'hbox',
    session: true,
    
    defaults: {
        margin: '10px'
    },
    
    items: [{
        xtype: 'grid', // grid master
        reference: 'usersGrid',
        border: true,
        width: '75%',
        height: '100%',
        bind: {
             store: '{users}'
        },

        columns: [
            {text: 'First Name', dataIndex: 'firstName', flex: 1},
            {text: 'Last Name', dataIndex: 'lastName', flex: 1},
            {text: 'Email', dataIndex: 'email', flex: 1},
            {text: 'Phone Number',  dataIndex: 'phone', flex: 1}
        ],
...

realmente nao consigo ver de onde pode vir o problema... o que de mais seria preciso para poder salvar os dados em modo batch? obrigado a todos.

#2 Loiane

Loiane

    Member Avançado

  • Expert User
  • 1013 posts
  • LocationSão Paulo - SP

Postado 24 February 2015 - 16:48

O batch só retorna a operação pro objeto mestre, não para as associações. Se vc não mudar o objeto mestre, o batch será nulo mesmo.

 

Isso foi uma coisa que me decepcionou no Ext JS 5. Mesmo com addons e extensões pra salvar tudo (mestre e detalhes), o ExtJS 5 ainda não faz isso.

 

O getChanges e aí manipular manualmente o objeto para salvar cada coisa no server é o que funciona. Ou vc usa o writer que obtem todas as mudanças incluindo as associations (https://github.com/l...ciations-writer). 


Autora dos livros:

Mastering Ext JS 5 http://bit.ly/1HWeHXh
Mastering Ext JS 4 http://bit.ly/14NZkxg

Ext JS 4: First Look http://bit.ly/o1IP1w
Sencha Architect http://bit.ly/19FVBGs
Curso ExtJS 4 Gratuito http://bit.ly/s5S0Oj (conceitos valem pro Ext 5 e 6 tb)





0 usuário(s) está(ão) lendo este tópico

0 membros, 0 visitantes, 0 membros anônimos