2014-01-31 5 views
6

我試圖做一個非常基本的基座應用程序來顯示項目列表,或者如果列表是空的文本消息。底座:您可以使用什麼數據流來呈現新初始化的空列表?

我以爲我想要的是:

  • 一個數據模型,其中[:根:項目]將是我的產品清單
  • 模板功能的頁面([:根])
  • 爲空列表靜態模板函數
  • 與元素
  • 在應用程序的啓動列表的動態模板功能,發送一條消息,將初始化列表爲空
  • 在渲染中,迴應:
    • [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]}) 
    

    的問題是,這樣一來,我得到一個數據模型與單:包含值根節點{:項目[]}。

    這可能聽起來像一個非常愚蠢的問題,但這兩個數據模型是一樣的嗎?

    [:root :systems] => [] 
    [:root] => {:systems []} 
    

    當我啓動我的應用程序,生成的渲染三角洲是:

    [node-create [] :map] 
    [node-create [:root] :map] 
    [value [:root] nil {:items [] }] 
    

    我不認爲這是適合我的渲染項目的清單,是嗎?

    UPDATE:

    @solussd意味着:兩個datamodels是相同的;但是,當生成以下三角洲時:

    [value [:root] nil {:items []}] 
    

    我仍然無法處理它。如果我加渲染的配置是這樣的:

    [value [:root :items] render-items-list] 
    

    然後render-items-list功能調用。

    如果我加渲染的配置是這樣的:

    [value [:root] render-root] 
    

    然後render-root函數將被調用,但很明顯,不正確的「路徑」,我想這也將被調用時,其他任何更改爲數據模型中的':root'元素已更改。

    任何想法,我怎麼能解決這個問題是值得歡迎...

  • +0

    您可以嘗試在pedestal-user郵件列表上發帖以獲取幫助 - https://groups.google.com/forum/#!forum/pedestal-users –

    +0

    雖然21世紀是一個不錯的地方,但我確信,我會盡力而且不會在那裏得到答案:P – phtrivier

    +0

    (是的,這是一個脾氣暴躁,幼稚的評論,只是不是正確的一天,對不起) – phtrivier

    回答

    1

    是,這兩個datamodels是相同的。

    node-create和value deltas足以將項目序列發送到渲染器,但渲染粒度是項目的整個列表。

    渲染的配置可能是這樣的:

    (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> ...}}}

    希望這會有所幫助。

    +0

    爲什麼'ul'會成爲列表項目的模板?它不應該在另一個模板'李'每個項目? – phtrivier

    +0

    (我編輯了我的問題以顯示我想要生成的HTML;我開始想知道模板需要什麼......) – phtrivier

    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] ...] 
    

    這將觸發你的主模板時,你的渲染三角洲開始到達渲染器。

    希望這會有所幫助。

    +0

    我不想添加'main'節點;我只想在[:root:items]而不是[:root]上發射一些東西。我會看看你的解決方案是否可以適應這樣做...... – phtrivier

    +0

    你可以省略'app/default-emitter'的參數,我相信這樣會產生你想要的。 – mdiin

    相關問題