2016-04-26 4 views
0

У меня есть две сущности, Пользователь и Роль как с manyToMany ассоциацией друг с другом.

Затем у меня есть сетка, отображающая список пользователей и права на форму с данными пользователя, включая теги, которые будут показывать и разрешать отдельные роли для пользователя.Extjs5 bound tagfield

Если привязка для tagfield устанавливается как

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

тогда не показывает ту роль, которую пользователь уже имеет и бросает:

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

когда один пытается установить пользователь роли

Таким образом, я также пытался связать значение tagfield к формуле, как

bind: { 
     store: '{roles}', 
     value: '{userRoles}' 
     } 

, а в поле tagfield показаны роли выбранного пользователя, но я не знаю, как вернуть выбранные роли в пользовательский объект.

Мои модели:

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' 
      } 
     } 
    } 
}); 

и

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' 
      } 
     } 
    } 
}); 

определение tagfield:

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

и 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){ 
      } 
     } 
    } 
}); 

Это мой самый первый проект с Ext, поэтому, возможно, мне не хватает какой-либо конфигурации в ассоциациях моделей, я не знаю. У меня много googled, но мне не хватает информации о связанном теге. Любая помощь будет с благодарностью оценена.

ответ

0

Ну я в конечном итоге, используя формулу, заполнив отсутствующий код сеттер так:

  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); 
        } 
       }); 
      } 

Эти массивы, которые я использую там, потому что:

(дель) не может цикла и удалить из той же коллекции, что и я зацикливаю

(noadd), если я попытаюсь добавить существующую запись в коллекцию ролей, она не будет добавлена ​​дважды, но в то время, когда существующая запись странно появляется как создание, я подумайте, что это BUG.

Я оставлю этот вопрос открытым в течение некоторого времени, поэтому, если вы знаете лучший способ решить эту проблему, вы можете внести свой вклад.

Спасибо!

 Смежные вопросы

  • Нет связанных вопросов^_^