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

Clojure 底座:您可以使用什么数据流来呈现新初始化的空列表?,clojure,clojurescript,pedestal,Clojure,Clojurescript,Pedestal,我正在尝试制作一个非常基本的底座应用程序来显示项目列表,如果列表为空,则显示一条短信 我想我想要的是: 一个数据模型,其中[:root:items]将是我的项目列表 页面的模板函数([:root]) 空列表的静态模板函数 用于包含元素的列表的动态模板函数 在应用程序启动时,发送一条消息,将列表初始化为空 在渲染时,响应: [节点创建[]:映射]通过执行以下操作。。。什么都没有 [节点创建[:root]:映射]通过呈现整个页面的模板 [节点创建[:root:items]:映射]为空列表添加模板

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

我想我想要的是:

  • 一个数据模型,其中[:root:items]将是我的项目列表
  • 页面的模板函数([:root])
  • 空列表的静态模板函数
  • 用于包含元素的列表的动态模板函数
  • 在应用程序启动时,发送一条消息,将列表初始化为空
  • 在渲染时,响应:
    • [节点创建[]:映射]
      通过执行以下操作。。。什么都没有
    • [节点创建[:root]:映射]
      通过呈现整个页面的模板
    • [节点创建[: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]
[value [:root] render-root]
然后不调用
呈现项目列表
函数

如果我添加如下呈现配置:

[value [:root :items] render-items-list]
[value [:root] render-root]
然后将调用
render root
函数,但显然不是使用正确的“路径”,我想在数据模型中对“:root”元素进行任何其他更改时也会调用该函数


任何关于如何修复的想法都是受欢迎的…

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

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

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

(defn render-config 
    []
    [:node-create [:root :items] render-item-list]
    [:value [:root :items] update-item-list])
如果要为列表中的每个项目使用模板,例如

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

    {:root{:items{:1: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] ...]
    
    当渲染增量开始到达渲染器时,这将触发主模板


    希望这会有所帮助。

    为什么“ul”会成为列表中某个项目的模板?它不应该在另一个模板中,每个项目都有“li”字样吗?(我编辑了我的问题,以显示我想要生成的HTML;我开始想知道模板需要是什么…)你可以尝试在用户邮件列表上发布以获得帮助-我认为21世纪是一个不错的地方,但肯定,我会尽量不在那里得到回答:P(是的,这是一个脾气暴躁和幼稚的评论。只是不是合适的一天。对不起。)我不想添加“主”节点;我只想在[:root:items]而不是[:root]上发出一些东西。我会看看你的解决方案是否适合这样做……你可以省略
    app/default emitter
    的参数,我相信这会产生你想要的结果。
    [... [:node-create [:main] render-root] ...]