Du bist nicht angemeldet. [Anmelden]
Optionen
Thema bewerten
Aus main.js auf HTML-UI aller Online-User zugreifen - #2885712 - 20.01.2018, 18:26:41
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 109
Hallo zusammen,

in meiner main.js werden alle Nutzer im Channel betrachtet:

var humanOnlineUsers = KnuddelsServer.getChannel().getOnlineUsers(UserType.Human);
var i = 0;
while (i<humanOnlineUsers.length) {
humanOnlineUsers[i].getPersistence().setNumber('irgendwas',1);
appView.sendEvent('irgendwas2', { UserPersistenceNumber: humanOnlineUsers[i].getPersistence().getNumber('irgendwas2', 0) });
[...]
}

In der home.html ist zugehörig so etwas mit drin:

Code:
Client.addEventListener('irgendwas2', function(e) {
  var data = e.data;
  var getUserNumber = data.UserPersistenceNumber; 
  document.getElementById('irgendwas2').innerHTML = getUserNumber;
});


und später die Anzeige ebenfalls in home.html:

Code:
<div id="irgendwas2"></div>


Das oben blau markierte funktioniert (schon immer): Für jeden User, der im Channel ist, wird automatisch der Persistenz-Wert angepasst.
Das rot markierte funktioniert nicht: Es sollte hier für jeden User die HTML-UI aktualisiert werden. Jedoch wird scheinbar für alle User die HTML-UI an der Stelle mit dem Wert von einem User aktualisiert: Somit ist dann die Anzeige für alle bis auf diesen einen falsch, was ist hier der Fehler?
Ist es hier nicht möglich, für alle Online-User die Anzeige zu aktualisieren?

[zum Seitenanfang]  
Re: Aus main.js auf HTML-UI aller Online-User zugreifen [Re: Tagtraum] - #2885754 - 21.01.2018, 01:46:53
Sephiroth ME
​gods own prototype

Registriert: 24.11.2003
Beiträge: 215
Ort: RLP, DE
Hallöle =)

Du kannst du dir die Daten, welche der listener erhält mal ausgeben lassen, einfach mit:
Code:
Client.addEventListener('irgendwas2', function(e) {
  alert('Data received: '+JSON.stringify(e));
  var data = e.data;
  var getUserNumber = data.UserPersistenceNumber; 
  document.getElementById('irgendwas2').innerHTML = getUserNumber;
});

Anhand der Snippets kann ich jetzt keinen Fehler auf den ersten Blick erkennen.

Minimiere allerdings die Auslastung in der Schleife etwas. Dies kannst du mit forEach etwas leichter handhaben wenn du wirklich alle Elemente durchgehen willst.
Hier eine Erläuterung: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
Code:
KnuddelsServer.getChannel().getOnlineUsers(UserType.Human).forEach(function(human) {
   var pers = human.getPersistence();
   pers.setNumber('irgendwas',1);
   appView.sendEvent('irgendwas2', { UserPersistenceNumber: pers.getNumber('irgendwas2', 0) });
});

Führt am Ende genau das gleiche aus wie deine Schleife, nur dass du nicht mehrfach die API für getPersistence() kontaktieren musst.

Ansonsten, bist du dir sicher, dass du einen anderen Wert übertragen willst, als den geänderten?

MfG =)
_________________________
one step closer to world domination

[zum Seitenanfang]  
Re: Aus main.js auf HTML-UI aller Online-User zugreifen [Re: Sephiroth ME] - #2885775 - 21.01.2018, 11:20:34
Tagtraum
Famil​ymitg​lied​

Registriert: 08.04.2003
Beiträge: 109
Hi Sephiroth ME,

danke für die Rückmeldung. Inzwischen ist mir aufgefallen, dass das Problem nichts mit dieser Schleife zu tun hat, sondern an jeder Stelle auftaucht, wenn mehr als ein Nutzer im Channel ist und die Anzeige in der HTML-UI aktualisiert wird.

Beispielstelle: Bei Beenden eines Spiels werden verschiedene Werte für den aktuellen Nutzer geändert:

Code:
appView.sendEvent('punkte', { UserPersistenceNumber: user.getPersistence().getNumber('punkte', 0) });
appView.sendEvent('punkteA', { UserPersistenceNumber: user.getPersistence().getNumber('punkteA', 0) });
appView.sendEvent('punkteB', { UserPersistenceNumber: user.getPersistence().getNumber('punkteB', 0) });
appView.sendEvent('punkteC', { UserPersistenceNumber: user.getPersistence().getNumber('punkteC', 0) });

Spielt man nun mit Nick 1, ist alles ok: Es werden die alten Werte von Nick 1 durch die neuen Werte ersetzt und angezeigt.
Spielt man aber mit Nick 2, dann bleibt die Anzeige bei Nick 2 unverändert (falsch) und die neuen Werte von Nick 2 werden bei Nick 1 eingeblendet (auch falsch).
Es werden alle neuen Werte immer bei Nick 1 eingeblendet, egal wer gespielt hat.

An der Stelle, wo die appView (=HTML-UI-Objekt) erstmals angezeigt/geladen wird, schreibe ich auch obige Befüllung mit Punkten, davor aber noch
Code:
user.sendAppContent(appView);

Hat es damit zu tun? Ich dachte, das wäre nur für die initiale Anzeige der HTML-UI.

Die appView-Variable ist in der js-Datei mit der Ausgabe oben auch gar nicht definiert (Definition nur in anderer js-Datei, bei Initialerzeugung). Es erscheint damit seltsam, dass durch den Code überhaupt etwas passiert. Die zweite Frage ist, warum es immer beim gleichen User passiert, egal wer spielt.

[zum Seitenanfang]  
Re: Aus main.js auf HTML-UI aller Online-User zugreifen [Re: Tagtraum] - #2885781 - 21.01.2018, 12:41:32
Bizarrus
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.560
Ort: Dortmund
Zitat:

Inzwischen ist mir aufgefallen, dass das Problem nichts mit dieser Schleife zu tun hat, sondern an jeder Stelle auftaucht, wenn mehr als ein Nutzer im Channel ist und die Anzeige in der HTML-UI aktualisiert wird


Doch, das Problem liegt daran. Dir fällt es nur nicht bei einem Nutzer auf, da er die Daten sendet, die zu diesem einen Nutzer halt gehören.

Du hast einfach einen Design-Fehler drin. Du möchtest jedem Nutzer seine eigenen Daten zusenden - Anstelle dessen, sendest du aber die Daten des letzten Nutzers an alle, das ist ein völlig falsches Handling.

Was zum Beispiel ist appView? Wo kommt das her? Jedenfalls nicht von dem Nutzer, zu dem du die Daten senden willst.

Zitat:
Die zweite Frage ist, warum es immer beim gleichen User passiert, egal wer spielt.

Versetze dich doch mal da hinein. Dein Designfehler wird immer die Daten des letzten Eintrages/Users senden, egal ob du nun mit einem Nick online bist oder wenn 20 Leute online sind.


Bearbeitet von Bizarrus (21.01.2018, 12:44:23)
_________________________
Bot.public('I love °>features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<°');

[zum Seitenanfang]  
Re: Aus main.js auf HTML-UI aller Online-User zugreifen [Re: Tagtraum] - #2885789 - 21.01.2018, 13:17:26
DdvOiD
​Still lovin

Registriert: 24.02.2005
Beiträge: 640
Ort: Deutschland, NRW, Kempen
Du musst dir die session von jedem user holen, und dann einzelnd die Daten an jeden user schicken - nicht über deine globales appview

KnuddelsServer.getChannel().getOnlineUsers(UserType.Human).forEach(function(human) {
var pers = human.getPersistence();
var session = human.getAppContentSession(AppViewMode.Overlay); // bei Overlay, oder PopUp bei PopUp wq
pers.setNumber('irgendwas',1);
session.sendEvent('irgendwas2', { UserPersistenceNumber: pers.getNumber('irgendwas2', 0) });
});
_________________________
Ich weiß ich bin ein A-loch... :-D , doch Scheiß egal ob ihr mich liebt... ICH hab mich gern :-]

[zum Seitenanfang]