2016-10-21 2 views
0

Я использую ExtJS-построить нефильтруемую панель DataView, это моя панель: Panel.jsExtJS 6 ViewModel магазин переплетов и сеттера

Ext.define('myApp.view.main.widgets.Panel', { 
    extend: 'Ext.panel.Panel', 

    .... 

    viewModel: { 
     type: 'widgets-view-model', 
     stores: { 
      widgets: { 
       type: 'widgets' 
      } 
     } 
    }, 

    items: [{ 
     xtype: 'searchfield', 
     name: 'widgets-filter', 
     height: 24, 
     width: '100%', 
     bind: { 
      store: '{store}' 
     } 
    }, { 
     margin: '5 0 0 0', 
     autoScroll: true, 
     bodyPadding: 1, 
     flex: 1, 
     frame: true, 
     referenceHolder: true, 
     bind: { 
      widgets: '{widgets.data.items}' 
     }, 
     setWidgets: function (widgets) { 
      this.lookupReference('the-widget-items-panel').setWidgets(widgets); 
     }, 
     items: [{ 
      layout: { 
       type: 'vbox', 
       pack: 'start', 
       align: 'stretch' 
      }, 
      items: [{ 
       reference: 'the-widget-items-panel', 
       xtype: 'the-widgets' 
      }] 
     }] 
    }] 
}); 

модель представление ничего не делает;

Ext.define('myApp.view.main.widgets.WidgetsViewModel', { 
    extend: 'Ext.app.ViewModel', 
    alias:'viewmodel.widgets-view-model' 
}); 

В контроллере вида я делаю следующее в обработчике событий afterrender;

onAfterRender: function() { 
    var store = this.view.getViewModel().getStore('widgets'); 
    store.load(); 
} 

В этот момент виджет виджетов «setWidgets» вызывается как ожидалось. Однако, когда я фильтрую хранилище с использованием метода «filterBy» в хранилище, я ожидаю, что будет вызываться установщик виджетов «setWidgets», но это не так.

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

store.removeAll(); 
store.load(function() { 
    console.log('reloaded...!') 
}); 

, чтобы увидеть, если перезагрузка хранения данных вызовет виджеты сеттер «setWidgets», но это не так.

Похоже, изменения в магазине viewModel запускают только вызовы в сеттеры только один раз.

ВОПРОС:

  1. Является ли это особенность структуры или я конфигурированию вещи неправильно.
  2. Как изменить конфигурацию view/store/viewModel так, чтобы вызывающий элемент «setWidgets» виджета вызывается для каждого обновления/изменения в хранилище, то есть когда;

    • данные загружены
    • магазин фильтруется
    • хранилище данных изменяет
    • обновления магазин

ответ

0

Фильтрация магазин не изменяет экземпляр items, он изменяет только содержимое - вот почему setWidgets не вызывается снова. Если вы хотите отреагировать на изменение данных в магазине, вам необходимо прослушать события из магазина.

Также - привязка к widget.data.items - плохая идея; который подключается к внутренней структуре магазина. Слушайте события вместо:

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