Пьедестал: какой поток данных вы можете использовать для отображения нового инициализированного пустого списка?

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

Я думал, что я хотел:

  • модель данных, где [:root:items] будет моим списком элементов
  • шаблонная функция для страницы ([:root])
  • функция статического шаблона для пустого списка
  • динамическая функция шаблона для списка с элементами
  • при запуске приложения отправьте сообщение, которое инициализирует список как пустой
  • при рендеринге ответьте на:
    • [node-create [] :map] делая... ничего?
    • [node-create [:root] :map] путем рендеринга шаблона для полной страницы
    • [node-create [:root :items] :map] добавив шаблон для пустого списка

Чтобы было ясно, что я хочу отобразить в конце (без элементов)

<html>
 <div>My list</div>
 <p>There is nothing in the list</p>
</html>

и когда есть что-то в списке:

<html>
 <div>My list</div>
 <ul>
   <li>item1</li>
   <li>item2</li>
 </ul>
</html>

Я на правильном пути здесь?

Я застрял при инициализации модели данных, чтобы быть тем, что я хочу. Самое близкое, что я получил, это:

;; behavior.clj
(defn init-root-transform [old-value message]
  {})

(defn init-items-transform [old-value message]
  [])

(def example-app
  {:version 2
   ;; :transform [[:set-value [:greeting] set-value-transform]]})
   :transform [[:bootstrap [:root] init-app-transform]
               [:bootstrap-systems [:root :items] init-items-transform]
               ]})

;; start.cljs
... skipped...
    (app/begin app)
    (p/put-message (:input app) {msg/type :bootstrap msg/topic [:root]})
    (p/put-message (:input app) {msg/type :bootstrap-systems msg/topic [:root :items]})

Проблема в том, что таким образом я получаю модель данных с единственным корневым узлом, содержащим значение {:items [] }.

Это может звучать как очень глупый вопрос, но являются ли эти две модели данных одинаковыми?

[:root :systems] => []
[:root] => {:systems []}

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

[node-create [] :map]
[node-create [:root] :map]
[value [:root] nil {:items [] }]

Я не думаю, что это подходит для отображения моего списка элементов, не так ли?

ОБНОВИТЬ:

@solussd подразумевает, что две модели данных одинаковы; однако, когда генерируется следующая дельта:

[value [:root] nil {:items []}]

Я все еще не могу справиться с этим. Если я добавлю конфигурацию рендеринга, как это:

[value [:root :items] render-items-list]

Тогда render-items-list функция не вызывается.

Если я добавлю конфигурацию рендеринга, как это:

[value [:root] render-root]

Тогда render-root Функция будет вызываться, но, очевидно, не с правильным "путем", и я предполагаю, что она также будет вызываться при изменении любого другого изменения элемента ": root" в модели данных.

Любая идея, как я могу это исправить, приветствуется...

2 ответа

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

{... :emit [[#{:root :items}] (app/default-emitter :main)]}

Это в основном говорит потоку данных публиковать изменения в [:root :items] как отдельные рендеринг дельты под путь [:main :root :items], В вашей конфигурации рендеринга вы должны указать этот путь:

[... [:value [:main :root :items] render-items] ...]

Вам нужно будет добавить путь рендеринга [:main] аналогичным образом, т.е.

[... [:node-create [:main] render-root] ...]

Это вызовет ваш основной шаблон, когда ваши рендеринг-дельты начнут поступать в рендерер.

Надеюсь, это поможет.

Да, эти две модели данных одинаковы.

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

Ваша конфигурация рендеринга может выглядеть так:

(defn render-config 
    []
    [:node-create [:root :items] render-item-list]
    [:value [:root :items] update-item-list])

Если вы хотите использовать шаблон для каждого элемента в списке, например,

<ul template="list-item" fields="id:id,content:item"/>

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

{:root {:items {:1 <item> :2 <item> ...}}},

Надеюсь это поможет.

Другие вопросы по тегам