2015-10-02 2 views
6

Я довольно новый Ext JS и пытаюсь вставить MultiSelect внутри Panel.Как связать Store ViewModel для просмотра?

ViewModel имеет stores свойство, как вы можете увидеть здесь:

Ext.define('TEST.view.controls.search.SearchFilterModel', { 
    extend: 'Ext.app.ViewModel', 
    alias: 'viewmodel.filter', 
    data: { 
     title: '' 
    }, 
    stores: { 
     test: { 
      fields: [ 'id', 'name' ], 
      proxy: { 
       type: 'ajax', 
       url: 'api/test', 
       reader: 'array' 
      }, 
      autoLoad: true 
     } 
    } 
}); 

Я хотел бы связать, что в моем View так:

viewModel: { 
    type: 'filter' 
}, 


layout: 'fit', 
border: 1, 
plain: true, 
scrollable: 'y', 
layout: 'fit', 


bind: { 
    title: '{title}', 
}, 


items: { 
    xtype: 'multiselect', 
    scrollable: false, 
    allowBlank: true, 
    ddReorder: true, 
    bind: { 
    store: '{test}' 
    }, 
    valueField: 'id', 
    displayField: 'name' 
} 

В этом случае store заканчивается как null, хотя и данные не загружаются в виджет. Вместо того, чтобы связывать хранилище, хотя, если я просто жестко кодирую его в представлении, то он работает.

Кто-нибудь может понять, в чем проблема?

+0

Почему вы решили, что магазин является нулевым? Что касается меня, то предоставленный фрагмент хорош и должен работать. Вы должны предоставить весь код представления, лучше всего будет предоставить скрипт jfiddle или sencha, чтобы продемонстрировать проблему. – yorlin

+0

@yorlin - Спасибо, я постараюсь собрать скрипку Сенча. Ошибка была 'Uncaught TypeError: не удалось прочитать свойство 'autoCreated' of null' – david

ответ

6

Вы можете передать пустой объект в хранилище дополнительно к связыванию магазина, что способ initComponent будет работать, например:

{ 
    xtype: 'multiselect', 
    fieldLabel: 'Multiselect', 
    store: {}, 
    bind: { 
     store: '{test}' 
    }, 
    valueField: 'id', 
    displayField: 'name' 
} 

Working пример: https://fiddle.sencha.com/#fiddle/ur8

+0

Считаете ли вы, что это ошибка или просто недокументированная странность? Является ли это вообще распространенным, что вам нужно будет дважды «хранить»? – david

+0

Фактически, когда вы связываете магазин, в первую очередь extjs создает пустое хранилище (не пустое, а временное хранилище), а затем связывает нормальный магазин. Проблема в том, что привязка происходит асинхронно и с задержкой. Вопрос в том, когда вы хотите получить доступ к своему магазину. Возможно, вы пытаетесь получить доступ к хранилищу, когда extjs не готов даже с пустым хранилищем. – yorlin

+0

@yorlin - Это имеет смысл, но я чувствую, что это деталь реализации, которую не нужно знать новым разработчикам extjs. И это требует, чтобы излишне выглядящий синтаксис выше связан с «магазином». – david

1

Это обычная проблема. Пока вы используете прокси-сервер в магазине, вам нужно загрузить хранилище после просмотра. В основном, это добавить к вашему View:

listeners: { 
      afterrender: function(view) { 
       this.getViewModel().getStore('{test}').load(); // this will provide proxy is being loaded 
      } 
      } 

Edit: я не заметил, что ты уже поставил autoLoad: true. После некоторых исследований компонент multiselect должен получить «объект хранения» во время рендеринга. Вот почему вы получаете ошибку «autoCreated». Я имею в виду, что до создания мультиселекта его магазин должен быть создан. В вашем случае сначала создается ваш мультиселективный компонент, а затем хранилище привязано к multiselect. Чтобы устранить эту проблему, пожалуйста, проверьте эту скрипку: https://fiddle.sencha.com/#fiddle/uqu

listeners: { 
       afterrender: function(view) { 
        view.add({ 
         xtype: 'multiselect', 
         scrollable: false, 
         allowBlank: true, 
         ddReorder: true, 
         fieldLabel: 'Multiselect', 
         store: view.getViewModel().getStore('test'), // comment to get autoCreated error 
         valueField: 'id', 
         displayField: 'name' 
        }); 
       } 
      }, 
+0

+1, но мне нравится другое решение немного лучше. Хотя никто не очень удовлетворяет. Кажется, это ошибка. – david

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