2016-12-23 14 views
2

Я пытался обвести голову вокруг запросов. Предположим, мне нужен компонент Root с несколькими видами таблиц.Понимание запросов Om и состава пользовательского интерфейса

official tutorial suggests - один подход должен состоять в том, чтобы иметь компонент табличного представления без запроса. И тогда вы можете передавать любые данные, которые нужно использовать через реквизиты, и это работает отлично.

Но это очень простой случай. В нетривиальном приложении, возможно, вы хотели бы иметь TableView с запросом, потому что с помощью дерева пользовательского интерфейса вы можете иметь сложную структуру пользовательских интерфейсов - таблицу-заголовок, нижний колонтитул, строки, ячейки и т. Д. Теперь this tutorial предлагает подход с запросом:

И все же это еще несколько упрощенный пример. Так скажем, если у меня есть:

(defmethod read :numbers/odd [_ _ _] 
    {:value (filter odd? (range 50))}) 

(defmethod read :numbers/even [_ _ _] 
    {:value (filter even? (range 50))}) 

в реальном приложении, конечно, данные будут поступать из фоновых и Ом будут придерживаться его в состоянии атома (как обычно)

теперь мне нужно иметь TableView компонент с запросом, который может отображать любой из этих (или любой последовательности в этом случае). Итак, вы видите Мне нужно как-то сообщить компоненту TableView использовать данные, которые находятся где-то еще в атоме состояния. И запрос для TableView должен быть «динамическим», поэтому я могу использовать несколько TableViews визуализации разных данных.

Скажем, мы бы что-то подобное для корня:

(defui Root 
    (query [_] [{:table/odd ,,,} {:table/even ,,,}]) 
    (render 
     [this] 
     (let [{:keys [table/odd table/even]}] 
     (html [:div 
       [:div.odds (ui-table-view odd)] 
       [:div.evens (ui-table-view even)]])))) 

для brewity I опущена интерфейсы Om.Next

Теперь у меня есть несколько вопросов:

  • Как должен выглядеть запрос для Root?
  • Должен ли я иметь параметризованный запрос в TableView(где я мог бы указать ключ для данных в атоме состояния)? Или как еще я могу сказать TableView использовать :numbers/odd, а другой - :numbers/even?
  • Если я использую параметризованный запрос в TableView, то как мне передать параметры от Root до TableView?
  • Возможно, мне нужно передать данные или ссылку на данные TableView через вычисленные реквизиты?
  • Как бы использовать то om/get-query (если параметризуется подзапрос)?
  • Как будут выглядеть методы чтения? Нужно ли мне «перемещать вещи» в атоме на read? Не звучит неплохо.

Может кто-нибудь, пожалуйста, покажет мне пример. Большое спасибо!.

ответ

0

Так вот что я придумал:

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

Так если у нас есть несколько таблиц (с нечетным и четным числом):

{:app/tables 
    [{:id  0 
     :title "Odd numbers" 
     :data-key :data/odds} 
     {:id  1 
     :title "Even numbers" 
     :data-key :data/evens}]} 

Это то, что будет читать метод выглядеть:

(defmethod parsing/read :app/tables 
     [{:keys [state parser] :as env} k _] 
     (let [ts    (get @state k) 
      merge-table-data' (fn [{:keys [data-key] :as t}] 
           (assoc t :table/data 
             (->> data-key 
              vector 
              (parser env) 
              vals 
              flatten)))] 
     {:value (map merge-table-data' ts)})) 

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

фрагмент кода для всего раствора here:

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

upd2: По-видимому, этот подход каким-то образом искажает мутации. Идея правильная, хотя - нужно использовать механику нормализации Om.Next. Я попытаюсь обновить суть позже.

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

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