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()”-motif 在服务器 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 回答