我正在尝试制作一个非常基本的基座应用程序来显示项目列表,或者如果列表为空,则显示短信。
我以为我想要的是:
- 一个数据模型,其中 [: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 节点的数据模型。
这听起来像是一个非常愚蠢的问题,但这两个数据模型是否相同?
[: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
将调用该函数,但显然不是使用正确的“路径”,我想当数据模型中的“:根”元素的任何其他更改发生更改时,它也会被调用。
欢迎任何想法我如何解决这个问题......