简体   繁体   English

如何将客户端属性添加到FirebaseListObservable中的项目?

[英]How do I add client-side attributes to items in a FirebaseListObservable?

I'm building a simple chat app backed by this Firebase Database structure: 我正在构建一个由此Firebase数据库结构支持的简单聊天应用程序:

messages: {
  "-KTjL_oLrKOboa2su2zk": {
    name: "puf",
    text: "Look I'm smiling :-)"
  },
  "-KTjNfaNem752ChFBcnC": {
    name: "puf",
    text: "And now I'm not smiling"
  }
}

I'm using Angular2 and AngularFire2 to generate the HTML. 我正在使用Angular2和AngularFire2生成HTML。 I have a simple list of messages from the Firebase Database in my controller: 我在控制器中有一个来自Firebase数据库的简单消息列表:

export class AppComponent {
  messages: FirebaseListObservable<any[]>;
  constructor(public af: AngularFire) {
    this.messages = af.database.list('messages');
  }
}

I want to detect certain conditions in each message and translate that into an emoji in my HTML. 我想检测每条消息中的某些条件,并将其转换为HTML中的表情符号。 Since this is purely display information derived from the existing content, I don't want to store it in the database. 由于这纯粹是显示来自现有内容的信息,因此我不想将其存储在数据库中。

My HTML template: 我的HTML模板:

<li class="text" *ngFor="let message of messages | async">
  {{message.name}} {{message.emoji}}: {{message.text}}
</li>

In the Firebase JavaScript SDK, this would be akin to: 在Firebase JavaScript SDK中,这类似于:

ref.on('child_added', function(snapshot) {
  var message = snapshot.val();
  if (message.text.indexOf(':-)') >= 0) {
    message.emoji = '🙂';
  }
  addMessageToHTML(message);
});

How should I do such client-side enrichment in AngularFire2? 我应该如何在AngularFire2中进行此类客户端丰富?

Not sure how things work in JSSDK, but when you subscribe (with async pipe) to FirebaseListObservable you are disconnected from Firebase (upstrem); 不确定JSSDK中的工作方式如何,但是当您(使用async管道)订阅FirebaseListObservable您将与Firebase断开连接(upstrem)。 you will still get updates (downstrem). 您仍将获得更新(downstrem)。 So you can just chain map() to the observable, and add property in the client: 因此,您可以将map()到可观察对象,然后在客户端中添加属性:

import 'rxjs/add/operator/map'

export class AppComponent {
  messages: FirebaseListObservable<any[]>;
  constructor(public af: AngularFire) {
    this.messages = af.database.list('messages')
      .map(messages => messages.map(message => {
        if (message.text.indexOf(':-)') >= 0) {
          message.emoji = '🙂';
        }
        return message;
      }))
  }
}

UPDATE: working example 更新: 工作示例

If you update data with 3rd record on the server side, template should update. 如果您在服务器端使用第3条记录更新数据,则模板应更新。 You can't however add new message to the this.messages on the client, you have to recreate reference and update the server that way: 但是,您不能在客户端上的this.messages添加新消息,必须重新创建引用并以这种方式更新服务器:

    af.database.list('messages').push({
      name: "new",
      text: "Now I'm sad :-("
      }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何验证客户端 google+ 登录信息? - How do I validate a client-side google+ login? 如何为 GatsbyJS 制作仅客户端的组件? - How do I make a client-side only component for GatsbyJS? 如何做高效的客户端认证? - How to do efficient client-side authentication? 如何防止HTML中的客户端更改数据属性? - how to prevent client-side change data-attributes in HTML? 如何在服务器端Ruby和客户端Javascript之间干扰业务逻辑? - How do I DRY up business logic between sever-side Ruby and client-side Javascript? 在客户端的 XMLHttpRequest 之后,如何在服务器端获取 FormData 值? - How do I get FormData values in Server-side after XMLHttpRequest in client-side? 如何将数据从客户端表单输入传输到服务器端Nodejs脚本? - How do I transfer data from a client-side form input to a server-side Nodejs script? 如何清除客户端中的服务器端数据表表行 - How do i clear the server-side datatables table rows in client-side 如何将服务器端ASP XmlHttpRequest代码转换为客户端JavaScript? - How do I convert my server-side ASP XmlHttpRequest code to client-side JavaScript? 如何在客户端而不是服务器端将我的哈巴狗文件渲染到 html - How do I render my pug files to html on the client-side instead of server-side
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM