Dies sollte eine ziemlich normale Aufgabe sein, und doch fehlt mir etwas.Aktualisieren von Polymer-Komponente mit Daten von außerhalb der Komponente
Ich versuche Socket.io mit Polymer zu integrieren [mit der Chat-Anwendung] - Entscheidung, die MessageList und die einzelnen messageItem als Polymer-Komponenten zu ändern. SocketIo legt ein customEvent offen, das vom Server ausgelöst werden soll. Die Nachricht wird als Daten gesendet, die dann einer Eigenschaft des benutzerdefinierten Elements zugewiesen wird.
Dies ist das MessageList-Element.
<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>
Auf der index.html-Seite -
var self = this;
socket.on('chatMessage' , function(msg) {
self.messages.push(msg);
console.log(self.messages);
document.querySelector('message-list').messageList = self.messages;
});
Mit all dies .. Jedesmal, wenn ein Client sendet eine Nachricht, die self.messages - Beiträge die Gesamtmenge von Nachrichten, aber die "_messageListChanged" der benutzerdefinierten Elemente wird nur beim ersten Mal aufgerufen.
Es gibt ähnliche Fragen - Updating a polymer element property with data from API call
jedoch die Daten durchsucht werden, funktioniert nur zum ersten Mal. Auch ich würde es gerne ohne Ajax-Eisen und so machen können.
Die Verwendung von 'self.messages.slice()' in jeder Chat-Nachricht ist sehr ineffizient und könnte für langwierige Konversationen kostspielig sein. – tony19
dies gilt nur für sehr sehr lange Arrays, versuchen Sie und sehen Sie die Zeit, die es dauert, Array mit 1000 Objekte zu schneiden, wenn er will, schrieb ich die Lösung mit dem Druck von Polymer ... – Alon
Was ich ging ist, eine andere Funktion ausgesetzt Auf das Element (wird von der JS aufgerufen), nimmt die neue Nachricht und schiebt es auf die MessageList, mit der Mutationsmethode, die Sie erwähnt haben. So funktioniert es jetzt. –