2013-01-08 42 views
2

我正在試驗derbyjs,無法弄清楚這些使用訂閱的實時更新是如何工作的。德比 - 自動「刷新」更改

目前,該應用程序僅僅是一個基本的後頭銜的可能列表,並在最後一個文本框,其中一個可以添加一個新的職位:

<Title:> 
    Sample derby app 

<Header:> 
    <!-- This is a component defined in the /ui directory --> 
    <ui:connectionAlert> 

<Body:> 
    <h1>Posts</h1> 
    <app:postList> 
    <input type="text" value="{_fieldValue}"><input type="button" value="add" x-bind="click:add"> 

<postList:> 
    {{#each posts}} 
     <app:post> 
    {{/}} 

<post:> 
    <div>{{title}}</div> 

應用程序有隻是「/」路線,應該訂閱所有帖子。相反,回調只是被調用首次員額從數據庫加載,但沒有任何變化:

// Derby routes can be rendered on the client and the server 
get('/', function(page, model, params) { 
    model.subscribe(model.query("posts").allPosts(), function(err, posts) { 
     page.render({ 
      posts:posts.get() 
     }) 
    }) 
}) 


// CONTROLLER FUNCTIONS // 

ready(function(model) { 
    this.add = function(){ 
     model.set("posts."+model.id(),{title:model.get("_fieldValue")}); 
     model.set("_fieldValue",""); 
    } 
}) 

的「getAllPosts()」 - 主題是在服務器上定義index.js文件:

store.query.expose("posts","allPosts",function(){ 
    return this; 
}); 

目前發生的是,當我按下「添加」 - 按鈕,一個新的職位被添加到數據庫中,但我只能看到在列表中後手動刷新頁面後。如果我在兩個單獨的選項卡中打開該頁面兩次,並在一個選項卡中添加新的帖子,則新帖子不會自動顯示在另一個選項卡中。

我錯過了什麼嗎?

回答

1

爲了做活動綁定,您需要使用單個括號。

嘗試改變<postList:>到:

<postList:> 
    {#each posts as :post} 
     <app:post> 
    {/each} 

<post:> 
    <div>{:post.title}</div> 

我還添加了as :post以確保路徑是正確的。這可以避免你可能遇到的很多錯誤。

如果這不能解決問題或者您還有其他問題,請在freenode上加入#derbyjs併發送給我(switz)。

+0

我在發佈答案後很短時間就試過了,但沒有什麼區別。從那以後,我在freenode網絡IRC上做了2-3次,但你不在那裏。現在我有時間再試一次。我正在嘗試使用最新版本的derby和racer,但仍然沒有獲得活動綁定。如果我理解這個權利,那麼model.subscribe函數應該在每次查詢結果發生變化時調用傳遞的回調函數,但它只在頁面加載時被調用。我認爲這是問題,而不是模板(即使當我將其更改爲您發佈的內容時)。 –

+0

我得到它的工作。我需要使用model.ref('_ posts',post)引用posts對象,然後在模板中迭代這個對象。如果你添加到你的anser,我會接受它:) –