2016-04-26 7 views
0

Ich habe zwei Entitäten, Benutzer und Rolle beide mit manyToMany Zuordnung zueinander.

Dann habe ich ein Raster mit der Liste der Benutzer und auf der rechten Seite ein Formular mit Benutzerdetails einschließlich eines Tagfield, die ausgewählte Rollen für den Benutzer anzeigen und zulassen.Extjs5 gebundene Tagfield

Wenn für die Tagfield die Bindung wird als

bind: { 
      store: '{roles}', 
      value: '{mainGrid.selection.roles}' 
     } 

es dann zeigen nicht die Rolle, die der Benutzer bereits hat und wirft:

"Uncaught TypeError: parentData[association.setterName] is not a function"

, wenn man versucht, den Benutzer zu setzen Rollen

So habe versucht, ich auch den Tagfield Wert auf eine Formel wie

zu binden 210

und das Tag-Feld zeigt die Rollen des ausgewählten Benutzers, aber ich weiß nicht, wie ich die ausgewählten Rollen auf die Benutzereinheit zurücksetzen soll.

Meine Modelle sind:

Ext.define('App.model.security.User', { 
    extend: 'App.model.Base', 

    entityName: 'User', 

    fields: [ 
     { name: 'id' }, 
     { name: 'email'}, 
     { name: 'name'}, 
     { name: 'enabled', type: 'bool'} 
    ], 

    manyToMany: { 
     UserRoles: { 
      type: 'Role', 
      role: 'roles', 
      field: 'id', 
      right: { 
       field: 'id', 
       role: 'users' 
      } 
     } 
    } 
}); 

und

Ext.define('App.model.security.Role', { 
    extend: 'App.model.Base', 

    entityName: 'Role', 

    fields: [ 
     { name: 'id' }, 
     { name: 'name'}, 
     { name: 'enabled', type: 'bool'} 
    ], 

    manyToMany: { 
     RoleUsers: { 
      type: 'User', 
      role: 'users', 
      field: 'id', 
      right: { 
       field: 'id', 
       role: 'roles' 
      } 
     } 
    } 
}); 

die Tagfield Definition:

xtype: 'tagfield', 
    fieldLabel: 'Roles', 
    displayField: 'name', 
    valueField: 'id', 
    stacked: true, 
    multiSelect: true, 
    filterPickList: true, 
    queryMode: 'local', 
    publishes: 'value', 
    bind: { 
     store: '{roles}', 
     value: '{userRoles}' 
    } 

und das Viewmodel:

Ext.define('App.view.security.user.UsersModel', { 
    extend: 'Ext.app.ViewModel', 

    alias: 'viewmodel.users', 

    stores: { 
     users: { 
      model: 'App.model.security.User', 
      pageSize: 15, 
      autoLoad: true, 
      session: true 
     }, 
     roles: { 
      model: 'App.model.security.Role', 
      autoLoad: true, 
      session: true 
     } 
    }, 

    formulas: { 
     userRoles: { 
      bind: { 
       bindTo: '{mainGrid.selection.roles.data.items}', 
       deep: true 
      }, 

      get: function(value){ 
       return value; 
      }, 

      set: function(value){ 
      } 
     } 
    } 
}); 

Dies ist mein allererstes Projekt mit Ext, vielleicht fehlt mir etwas Konfiguration bei den Modellassoziationen, ich weiß es nicht. Ich habe viel gegooglet, aber es fehlen Informationen über das verknüpfte Tagfield. Jede Hilfe wird dankbar geschätzt.

Antwort

0

Nun landete ich nach der Formel oben durch den fehlenden Code der Setter wie folgt durchführen:

  set: function(values){ 
       //Delete the roles that were not established 
       var del = [], noadd = []; 
       var roles = this.get('mainGrid').selection.roles(); 
       roles.each(function(record){ 
        if (values.indexOf(record.get('id')) == -1) { 
         del.push(record); 
        } 
        else { 
         noadd.push(record.get('id')); 
        } 
       }); 
       del.forEach(function(record){ 
        roles.remove(record); 
       }); 

       //Add the roles that didn't exist 
       var store = this.getStore('roles'); 
       var allRecords = store.getData().getSource() || store.getData(); 
       allRecords.each(function(record){ 
        if (values.indexOf(record.get('id')) != -1 && noadd.indexOf(record.get('id')) == -1) { 
         roles.add(record); 
        } 
       }); 
      } 

Diese Arrays, die ich verwende sind dort, weil:

(del) kann nicht Schleife und Löschen über die gleiche Sammlung, die ich Schleife bin

(noadd) wenn ich versuche, einen vorhandenen Datensatz in die Rollen Sammlung hinzufügen, wird es nicht zweimal hinzugefügt, aber zum Zeitpunkt der Speicherung der vorhandene Datensatz erscheint seltsamerweise als erstellen, ich denke, das ist ein Fehler.

Ich werde diese Frage für einige Zeit offen lassen, also wenn Sie einen besseren Weg kennen, um das zu lösen, können Sie Ihren Beitrag leisten.

Danke!