have read a lot of guides and did not understand - how to rerender ember’s component internally? (not by user’s action).
e.g. I have a component that shows a list of objects received from websockets and want to redraw the list when a new object is received:
component js code:
import Ember from 'ember';
import Phoenix from 'ember-phoenix-chan';
const {Socket, Channel, LongPoll, Ajax, Presence} = Phoenix;
//import {Socket, LongPoller} from "phoenix"
const { get, inject } = Ember;
export default Ember.Component.extend({
didRender() {
console.log("didRender")
},
clientList: [],
doubleClick() {
Ember.Logger.info("DoubleClickableComponent was clicked");
let socket = new Socket(ws://1.1.1.1:4000/socket", {
logger: ((kind, msg, data) => { console.log(`!!!! ${kind}: ${msg}`, data) })
})
//socket.connect({user_id: "123"})
var $guid = "Sashka";
socket.connect({client_id: $guid, client_type: "browser", client_name: "anonymous"});
var chan = socket.channel("rooms:666", {});
chan.join()
//.receive("error", resp => { console.log("error on JOIN", resp) } )
//.receive("ignore", resp => { console.log("auth error", resp) } )
.receive("ok", resp => { console.log("join ok", resp) } )
//.after(10000, resp => { console.log("Connection interruption", resp) })
chan.onError(e => console.log("something went wrong", e))
chan.onClose(e => console.log("channel closed", e))
/*
$input.off("keypress").on("keypress", e => {
if (e.keyCode == 13) {
chan.push("new:msg", {user: $username.val(), body: $input.val()})
$input.val("")
}
})
*/
chan.on("join", obj => {
console.log("rcvd JOIN", obj)
this.get('clientList').push(obj)
this.update
})
chan.on("client:connected", obj => {
console.log("rcvd CLCND", obj)
})
chan.on("new:msg", msg => {
console.log("NEW:MSG")
$messages.append(this.messageTemplate(msg))
scrollTo(0, document.body.scrollHeight)
})
chan.on("user:entered", msg => {
var username = this.sanitize(msg.user || "anonymous")
$messages.append(`<br/><i>[${username} entered]</i>`)
})
return true;
}
});
Components tamplate:
{{outlet}}
websockets sample
<br>
<div class="page">
<div class="content-padded">
{{#each messages as |message|}}
{{message}}
{{/each}}
<br><br>
<div class="form-control">
<label>New Message</label>
{{input value=newMessage class="form-control"}}
<button class="btn" {{action 'sendMessage'}}>Send Message</button>
</div>
</div>
</div>
<div class="footer">
</div>
{{#ws-component}}
click here!
{{/ws-component}}
Objects List:
{{#each clientListD as |client|}}
<li>{{client}}</li>
{{/each}}
the problem is that when this.get(‘clientList’).push(obj) happens, the template is not redrawing the list, i want to redraw it correctly after the list is changed. how?