基座:您可以使用什么数据流来呈现新初始化的空列表?

pht*_*ier 6 clojure clojurescript pedestal

我正在尝试创建一个非常基本的基座应用程序来显示项目列表,或者如果列表为空则创建一条短信.

我以为我想要的是:

  • 一个数据模型,其中[: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>
Run Code Online (Sandbox Code Playgroud)

当列表中有东西时:

<html>
 <div>My list</div>
 <ul>
   <li>item1</li>
   <li>item2</li>
 </ul>
</html>
Run Code Online (Sandbox Code Playgroud)

我在这里走在正确的轨道上吗?

我坚持初始化数据模型是我想要的.我得到的最接近的是:

;; 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]})
Run Code Online (Sandbox Code Playgroud)

问题是,通过这种方式,我得到了一个包含值{:items []}的单个:根节点的数据模型.

这可能听起来像一个非常愚蠢的问题,但这两个数据模型是否相同?

[:root :systems] => []
[:root] => {:systems []}
Run Code Online (Sandbox Code Playgroud)

当我启动我的应用程序时,生成的渲染增量是:

[node-create [] :map]
[node-create [:root] :map]
[value [:root] nil {:items [] }]
Run Code Online (Sandbox Code Playgroud)

我不认为这适合渲染我的物品清单,是吗?

更新:

@solussd暗示两个数据模型是相同的; 但是,当生成以下增量时:

[value [:root] nil {:items []}]
Run Code Online (Sandbox Code Playgroud)

我仍然无法处理它.如果我添加这样的渲染配置:

[value [:root :items] render-items-list]
Run Code Online (Sandbox Code Playgroud)

然后调用该render-items-list函数.

如果我添加这样的渲染配置:

[value [:root] render-root]
Run Code Online (Sandbox Code Playgroud)

然后render-root将调用该函数,但显然不是使用正确的"路径",并且我认为当数据模型中对':root'元素的任何其他更改发生更改时,也会调用它.

任何想法如何解决这个问题都是受欢迎的...

小智 1

是的,这两个数据模型是相同的。

节点创建和值增量足以将项目序列发送到渲染器,但您渲染的粒度是整个项目列表。

您的渲染配置可能如下所示:

(defn render-config 
    []
    [:node-create [:root :items] render-item-list]
    [:value [:root :items] update-item-list])
Run Code Online (Sandbox Code Playgroud)

如果您想为列表中的每个项目使用模板,例如,

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

在 html 模板文件中),您可能希望在单个列表项级别输出增量,并可能让它们成为映射中的键值,例如如下模型:

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

希望这可以帮助。