pht*_*ier 6 clojure clojurescript pedestal
我正在尝试创建一个非常基本的基座应用程序来显示项目列表,或者如果列表为空则创建一条短信.
我以为我想要的是:
[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> ...}}}
。
希望这可以帮助。