2016-10-21 2 views
2

Я определил хранилище и фильтр. ViewModel содержит объект test. Мне нужно фильтровать объекты хранилища этим объектом.Как я могу получить объект viewModel в функции фильтра хранилища?

Ext.define('XXX.view.XXX.ViewXXXXModel', { 
    extend: 'Ext.app.ViewModel', 

...

stores: { 
     agreements: { 
      source: 'XXX', 
      filters: { 
       filterFn: function(item) { 
        return item.some_field !== this.get('test').somevalue; 
       } 
      } 
     } 
    } 

Я не могу получить доступ к тестовому объекту View Model из функции фильтра?

ответ

1

Пути слишком поздно, но я была такая же проблема, и чистящий способ сделать это путем возврата filterFn как формулы связывают:

Для исходного примера:

stores: { 
    agreements: { 
     source: 'XXX', 
     filters: [{ 
      filterFn: '{storeFilter}' 
      }] 
     } 
    } 
}, 
formulas: { 
    storeFilter: function(get) { 
     var somevalue = get('test').somevalue; 
     return function(item) { 
      return item.some_field !== this.get('test').somevalue;     
     }; 
    } 
} 
3

В идеале вы должны использовать формат декларативного фильтра в большинстве случаев - гранулярность гарантирует, что привязки более специфичны, вызывая соответствующие/ожидаемые обновления при изменении данных. Например:

stores: { 
    agreements: { 
     source: 'XXX', 
     filters: { 
      property: 'some_field', 
      value: '{test.somevalue}', 
      operator: '!=' 
     } 
    } 
} 

Если вы действительно хотите использовать императивный код, который можно впрыснуть вид-модель сферы с помощью формулы:

formulas: { 
    _this: function(){ 
     return this; 
    } 
} 

Затем привязать его следующим образом:

stores: { 
    agreements: { 
     source: 'XXX', 
     filters: { 
      scope: '{_this}', 
      filterFn: function(item){ 
       return item.some_field !== this.get('test.somevalue')); 
      } 
     } 
    } 
} 

Это немного клочья, хотя изменения в test, вероятно, не будут отображаться в магазине и любых визуальных компонентах привязанный к ней. В этом случае вам придется вручную перезагрузить хранилище или повторно применить фильтры - какой вид победит MVVM.

+0

Могу ли я выполнить некоторую операцию с тестовым объектом (например, изменить какое-либо свойство), когда я использую декларативный формат фильтра? Как фильтры: { свойство: 'строка field', значения: '{test.somevalue}', оператор: '! =' } – Andrei

+0

Как 'фильтры: {свойство: 'строка field', значение:«{test.somevalue + new Date(). getDate()} ', operator:'! = '} ' – Andrei

+0

В этом случае императивный подход более подходит. Проблема заключалась в том, чтобы вводить правильную область для фильтрации. – Andrei

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