Read the statement by Michael Teeuw here.
Notification between modules
-
I tried to have two modules sending notification to each other: ModuleA sending “TEST_NOTI” to ModuleB, and ModuleB shows the information of this notification on mirror.
I put ModuleA and ModuleB in different folders named by themselves.
My code in ModuleA is like:start:function(){ this.count=0; }, notificationReceived:function(notification,payload,sender){ switch(notification){ case "DOM_OBJECTS_CREATED": var timer=setInterval(()=>{ this.count++; this.sendNotification("TEST_NOTI",this.count); },1000) break; default: break; } },
My code in ModuleB is like:
getDom:function(){ var wrapper=document.createElement("p"); wrapper.className="test results"; wrapper.id="parent"; wrapper.innerHTML="test results: "; return wrapper; }, notificationReceived:function(notification,payload,sender){ var self=this; switch(notification){ case "DOM_OBJECTS_CREATED": setInterval(()=>{ this.updateDom(); },1000) break; case "TEST_NOTI": var parent=document.getElementById("parent"); var child=document.createElement("p"); child.id="test notification"; child.innerHTML="TEST_NOTI received"+payload; parent.appendChild(child); break; default: break; } },
I assume that ModuleB will show
test results: TEST_NOTI received [counting]
where [counting] counts from 1 to infinity.
However, the second line of my assumption only appears occasionally
. I could hardly find any regulation in its appearance.
Could anyone help me to figure out whether its a problem within my code or its a problem of the notification connection?
Are there any place to learn about the notification except the doc? -
technically, you are not supposed to update the dom until getDom() method time.
you can update the data in the notificationReceived method, and then call updateDom() to indicate you have changes to present.this will cause getDom() to be called.
-
@sdetweil but I did call updateDom() in ModuleB…
-
finally I solved this problem as @sdetweil told me: keep all coding of DOM within the getDom() function, initialize my data in start function, and update the data in the notificationReceived method.
the updateDom() function is repeatedly called after receiving “DOM_OBJECT_CREATED” notification. -
@grasshopper001 You are in two different scopes. Try to add
.bind(this)
to yoursetInterval
’s callback.Also do you see any errors on the browser side?
- Open Chrome and navigate to your MagicMirror’s Webinterface
- Open the Chrome Dev Tools via
F12
(on Windows) - Keep an eye out for anything red in the console
- Optional You can also directly debug your modules code in the dev tools.
-
@idoodler he’s using arrow functions
=>
, therefore he stays in the same scope. -
@strawberry-3-141 Thanks, again what learned:)
-
@grasshopper001 nice work.
One comment to think about. You should not call updateDom() if you do NOT have changed content to present
This wastes cpu cycles, raising heat. And maybe preventing some other module from displaying properly.
-
@sdetweil Thanks! I’ve rewritten my code according to your comment.
-
@idoodler thanks for the help.The console part in the dev tool does help a lot!