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;
});

現在何が起こっているかというと、「追加」ボタンを押すと新しい投稿がデータベースに追加されますが、ページを手動で更新した後にのみリストに投稿が表示されます。ページを 2 つの別々のタブで 2 回開き、一方のタブに新しい投稿を追加すると、新しい投稿が他方のタブに自動的に表示されません。

私は何か見落としてますか?

4

1 に答える 1

1

ライブ バインディングを行うには、単一のブラケットを使用する必要があります。

次のように変更<postList:>してみてください:

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

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

as :postまた、パスが正しいことを確認するために追加しました。これにより、遭遇する可能性のある多くのバグを回避できます。

これで問題が解決しない場合、または他に質問がある場合は、freenode の #derbyjs に参加して、私 (switz) にメッセージを送信してください。

于 2013-01-09T18:33:11.660 に答える