6

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

我以为我想要的是:

  • 一个数据模型,其中 [: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将调用该函数,但显然不是使用正确的“路径”,我想当数据模型中的“:根”元素的任何其他更改发生更改时,它也会被调用。

欢迎任何想法我如何解决这个问题......

4

2 回答 2

1

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

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

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

(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 模板文件中),您可能希望在单个列表项级别输出增量,并可能让它们成为地图中的键值,例如,像这样的模型:

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

希望这可以帮助。

于 2014-01-31T13:21:50.573 回答
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] ...]

当您的渲染增量开始到达渲染器时,这将触发您的主模板。

希望这会有所帮助。

于 2014-02-22T08:30:38.617 回答