2014-01-31 1 views
6

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

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

  • модель данных, где [: корень: пункты] был бы мой список элементов
  • функция шаблона для страницы ([: корень])
  • статическая функция-шаблона для пустого списка
  • функция динамического шаблона для списка с элементами
  • в начале приложения, отправить сообщение, которое будет инициализировать список пустой
  • в рендеринге, ответьте на:
    • [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]}) 

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

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

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

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

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

Я не думаю, что это подходит для визуализации мой список элементов, не так ли?

ОБНОВЛЕНИЕ:

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

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

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

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

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

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

[value [:root] render-root] 

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

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

+0

Возможно, вы попытаетесь опубликовать рассылку в списке почтовых пользователей, чтобы получить справку - https://groups.google.com/forum/#!forum/pedestal-users –

+0

Я, хотя 21-й век был хорошим местом, но уверен , Я попробую, и не получится ответить ни там, ни там: P – phtrivier

+0

(Да, это грустный и ребяческий комментарий. Только не в тот день. Извините.) – phtrivier

ответ

1

Да, эти два datamodels одинаковы.

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

рендеринге конфигурации может выглядеть следующим образом:

(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) , вы можете захотеть вывести deltas на уровне отдельных элементов списка и, вероятно, иметь их в качестве ключей на карте, например модель, подобная:

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

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

+0

Почему 'ul' был шаблоном для элемента списка? Разве это не должно быть в другом шаблоне с «li» для каждого элемента? – phtrivier

+0

(Я отредактировал мой вопрос, чтобы показать HTML, который я хочу сгенерировать, я начинаю задаваться вопросом, какие шаблоны должны быть ...) – phtrivier

1

У меня нет компьютера, чтобы проверить это прямо сейчас, но я думаю, что если добавить 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] ...] 

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

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

+0

Я не хочу добавлять «главный» узел; Я просто хочу, чтобы что-то испускалось в [: root: items] вместо [: root]. Я посмотрю, может ли ваше решение быть адаптировано для этого ... – phtrivier

+0

Вы можете опустить аргумент 'app/default-emitter', я верю, что даст то, что вы ищете. – mdiin