Ir para conteúdo


Foto

[RESOLVIDO] Salvando modelo com associaçoes


  • Por favor, faça o login para responder
4 respostas neste tópico

#1 insanity

insanity

    Iniciante

  • Membros
  • Pip
  • 3 posts

Postado 10 October 2014 - 22:10

Bom dia,


            Tenho uma duvida com o Ext-Js especialmente na versao 5, tenho um modelo de autenticaçao e direitos de acesso baseado em usuarios, grupos e privilegios, alem de usar algumas outras associaçoes como empresa, etc, irei mostrar meu modelo:

Classe Usuario:

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: 'telephone', type: 'string'},
        {name: 'login', type: 'string'},
        {name: 'password', type: 'string'},
        {name: 'contactTypeId', type: 'string'},
        {name: 'roleIds', type: 'string'},
        {name: 'logIds', type: 'string'}
    ],
    
    hasMany: [{
        name: 'companies',
        model: 'Company',
        associationKey: 'companies'
    },{
        name: 'groups',
        model: 'Group',
        associationKey: 'groups'
    },{
        name: 'roles',
        model: 'Role',
        associationKey: 'roles'
    },{
        name: 'contactTypes',
        model: 'ContactType',
        associationKey: 'contactTypes'
    }]
});

Classe Company:

Ext.define('Manager.model.Company', {
    extend: 'Manager.model.Base',
    
    fields: [
        {name: 'name', type: 'string'},
        {name: 'companyNumber', type: 'string'},
        {name: 'street', type: 'string'},
        {name: 'postalCode', type: 'string'},
        {name: 'contacts', type: 'string'},
        {name: 'roles', type: 'string'}
    ]
});

Enfim, algo simples, o carregamento dos dados esta funcionando perfeitamente, o principio da aplicaçao é que tenho uma grid principal com paginaçao e as associaçoes sao mostradas em outras grids em modo master/detail, estou usando bind no meu viewmodel e o problema é que depois de modificar as associaçoes do meu usuario, o record nao passa em estado dirty, e quando faço record.save() no usuario, ele nao envia nenhum dado relativo as associaçoes ao servidor, nao importa quantas modificaçoes foram feitas nas associaçoes, para a versao 4 do ext, eu li algo relativo a fazer um override no writer do store, o que a primeira vista parece uma soluçao, mas gostaria de saber se existe uma maneira mais "limpa" de se fazer isso no ext 5, alguem ja passou por

Obs.: acho que seria mais apropriado usar manyToMany na associaçao entre usuario e empresa.

Agradeço antecipadamente e se precisarem de mais detalhes sobre a aplicaçao, irei postar o que mais for preciso.

#2 Loiane

Loiane

    Member Avançado

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

Postado 13 October 2014 - 09:57

Olá,

Bem, essa associação hasMany ainda funciona no ExtJS 5, mas está deprecated - apesar de pessoalmente ainda preferir usar hasMany do que a nova maneira.

A nova maneira é usando reference, bem similar no que fazemos com foreign-keys no banco de dados.

Bem, pra salvar dados no Ext JS recomenda-se que use a Session. Quando a Session está habilitada na View (e views filhas, como popup pra editar), e a Store tb está linkada na Session, qualquer mudança na Store mãe ou Store filhas (criadas para a association dos Models) é salva na Session. Ai basta vc salvar a Session que tudo é salvo no servidor.
Para que isso funcione, é importante declarar o proxy nos Models e não na Store.

A Sencha fez um exemplo pra esse caso: http://dev.sencha.co...g-child-session

Mas, se não quiser ter o trabalho de modificar o seu código pra funcionar nessa nova maneira, sugiro criar o seu próprio writer e usá-lo quando precisar (note que não é override, é o seu próprio writer mesmo, adicionando o recurso de salvar associações, já que o Ext JS não tem suporte nativo a isso com esse approach).
Tenho um exemplo nesse link: https://github.com/l...b/master/app.js

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)


#3 insanity

insanity

    Iniciante

  • Membros
  • Pip
  • 3 posts

Postado 14 October 2014 - 14:04

Obrigado Loiane pelas explicaçoes, vou marcar o post como resolvido afinal voce me esclareceu e deu muitas pistas de onde obter mais informaçoes, abraço

#4 edson.hh

edson.hh

    Member Avançado

  • Membros
  • PipPipPip
  • 65 posts

Postado 16 December 2014 - 16:00

Boa tarde!
Loiane.
Estou fazendo algo bem simples para verificar o funcionamento de Model Association. 2 tabelas e relacionada por um campo (Legislação e Tipo, sendo a Legislação tem um tipo ).
Tenho um form com um combo q traz todos os Tipos para cadastro da Legislação .

Qdo vou gravar, aparece dessa forma:

Imagem Postada

Meu model esta dessa forma. Pelo que pesquisei, nao exite mais hasmany, etc.. é tudo por reference.

MODELS:
Ext.define('Admin.model.LegLegislacao', {
    extend: 'Ext.data.Model',
    fields:
    [
        { name: 'leg_id', type: 'int' },
        { name: 'leg_numero', type: 'int' },
        { name: 'leg_ano', type: 'int' },
        { name: 'leg_descricao', type: 'string' },
        { name: 'tp_id', reference: 'LegTipo'}
    ],
    idProperty: 'leg_id'
});

------------
Ext.define('Admin.model.LegTipo', {
    extend: 'Ext.data.Model',
    fields:
    [
        { name: 'tp_id', type: 'int' },
        { name: 'tp_abrev', type: 'string' },
        { name: 'tp_nome', type: 'string' }
    ],
    idProperty: 'tp_id'
}); 


Meu FORM do combo esta assim
                    }, {
                        xtype: 'combobox',
                        fieldLabel: 'Tipo',
                        store: Ext.create('Admin.store.LegTiposStore'),
                        queryMode: 'local',
                        displayField: 'tp_nome',
                        valueField: 'tp_id',
                        labelAlign: 'right',
                        anyMatch: 'true',
                        width: 600,
                        name: 'tp_id',
                        allowBlank: false
                    }, {

O Model association é para eu consegui enviar o OBJETO LegTipo dentro do objeto Legislação , ao inves do tp_id como string? Como fazer isso?





#5 EthraZa

EthraZa

    Member Avançado

  • Expert User
  • 542 posts
  • LocationSão Paulo

Postado 31 October 2015 - 13:16

Olá,

Bem, essa associação hasMany ainda funciona no ExtJS 5, mas está deprecated - apesar de pessoalmente ainda preferir usar hasMany do que a nova maneira.

A nova maneira é usando reference, bem similar no que fazemos com foreign-keys no banco de dados.

Bem, pra salvar dados no Ext JS recomenda-se que use a Session. Quando a Session está habilitada na View (e views filhas, como popup pra editar), e a Store tb está linkada na Session, qualquer mudança na Store mãe ou Store filhas (criadas para a association dos Models) é salva na Session. Ai basta vc salvar a Session que tudo é salvo no servidor.
Para que isso funcione, é importante declarar o proxy nos Models e não na Store.

A Sencha fez um exemplo pra esse caso: http://dev.sencha.co...g-child-session

Mas, se não quiser ter o trabalho de modificar o seu código pra funcionar nessa nova maneira, sugiro criar o seu próprio writer e usá-lo quando precisar (note que não é override, é o seu próprio writer mesmo, adicionando o recurso de salvar associações, já que o Ext JS não tem suporte nativo a isso com esse approach).
Tenho um exemplo nesse link: https://github.com/l...b/master/app.js

Olá Loiane.

 

Você sabe dizer se seu exemplo de AssociatedWriter ainda funciona no ExtJs 6.0. Coloquei tudo lá mas não consigo fazer funcionar.

Eu altero dados no store Filho e posso ver no store Pai que, usando o getter para Filhos, o getModifiedRecords traz as mudanças que foram feitas no Filho, mas o Pai.sync() faz absolutamente nada, como se não houvessem mudanças no store.

 

Obrigado.

 

**** EDIT 2 ****

Infelizmente só está funcionando para registros modificados, para registros adicionados ou removidos parece não haver "link" entre os Stores.
 

 

**** EDIT 1 ****

Acabei de resolver isso, sujando o record alterado do Pai "manualmente".

 

No store Filho adicionei:

listeners: {
    	update: function(store, record, operation, modifiedFieldNames, details, eOpts) {
    		var c = Ext.ComponentQuery.query('#listCombo')[0];
    		
    		c.getSelectedRecord().dirty = true;
    		c.store.sync();
    	},
        remove: function(store, record, operation, modifiedFieldNames, details, eOpts) {
                var c = Ext.ComponentQuery.query('#listCombo')[0];
        
                c.getSelectedRecord().dirty = true;
                c.store.sync();
        }
}

Editado por EthraZa, 01 November 2015 - 20:20.

Mandriva Linux in LAMPE (Linux/Apache/MySql/Php/Ext)




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

0 membros, 0 visitantes, 0 membros anônimos