这应该是一个非常正常的任务,但我错过了一些东西。使用组件外部的数据更新聚合物组件
我正在尝试将Socket.io与Polymer [使用聊天应用程序]进行集成 - 决定将MessageList和个别messageItem更改为Polymer组件。 SocketIo公开从服务器抛出的一个customEvent,它将消息作为数据发送,然后将其分配给自定义元素上的属性。
这是MessageList元素。
<link rel="import" href="/polymer/polymer.html">
<link rel="import" href="message.html">
<dom-module id='message-list'>
<template>
<style>
</style>
<ul id="messages">
<template is='dom-repeat' items="{{messageList}}" is="auto-binding">
<li>
<message-item message = "{{item}}"></message-item>
</li>
</template>
</ul>
</template>
<script>
var messageListElement = Polymer({
is : 'message-list',
properties : {
messageList : {
type : Array,
observer: '_messageListChanged',
reflect : true ,
value : function() {
return [{'inputMessage' : 'Welcome to the Chat' ,
'nickName' : 'System' , 'msgTime' : new Date()}]
}
//, notify : true
}
},
_messageListChanged: function(newValue , oldValue) {
console.log("Data changed");
},
created : function() {
console.log("messagelist created");
},
ready : function() {
console.log("messagelist ready");
},
attributeChanged : function() {
console.log("messagelist attributeChanged");
}
});
</script>
在index.html页面 -
var self = this;
socket.on('chatMessage' , function(msg) {
self.messages.push(msg);
console.log(self.messages);
document.querySelector('message-list').messageList = self.messages;
});
有了这一切..每当一个客户端发送消息,所述self.messages - 帖子的总组消息,但自定义元素的“_messageListChanged”仅在第一次被调用。
有类似的问题 - Updating a polymer element property with data from API call
但是分配的数据,仅适用于第一次。 另外我想能够做到这一点,而不使用ajax铁和东西。
在每个聊天消息中使用'self.messages.slice()'是非常低效的,并且对于冗长的会话可能会导致成本过高。 – tony19
这只适用于非常长的阵列,试着看看用1000个物体切片数组所需要的时间,如果他想要的话,我用聚合物的推动来写出解决方案... – Alon
我所做的就是暴露另一个函数在元素上(从JS中调用),使用您提到的突变方法接收新消息并将其推送到messageList。所以它现在工作。 –