2017-06-19 2 views
0

Ich habe diese Modelle:Ember.js 2, viele klicken, viele Beziehungen, wie viele Klicks zu behandeln?

Kampf:

export default Model.extend({ 
    teams: hasMany('team') 
}); 

Mannschaft:

export default Model.extend({ 
    closed: attr('boolean'), 
    fight: belongsTo('fight'), 
    players: hasMany('player') 
}); 

Spieler:

export default Model.extend({ 
    team: belongsTo('team'), 
    nickname: belongsTo('nickname') 
}); 

Nickname:

export default Model.extend({ 
    nickname: belongsTo('nickname') 
}); 

Jetzt bin ich in der Kampf Seite und ich habe eine Liste der alle Spitznamen und mit einem Klick auf jeden Ich muss:

  • Wenn es keine Teams gibt, die bereits im Kampf sind (dieses Modell), erstelle ich ein Team und danach füge ich meinen Spieler in dieses Team ein;
  • Wenn ein Team bereits im Kampf ist und "NICHT GESCHLOSSEN" ist, füge ich einfach meinen Spieler in das letzte Team ein;
  • Wenn ein Team bereits im Kampf ist und "GESCHLOSSEN" ist, muss ich ein neues Team für diesen neuen Spieler und alle anderen neuen Spieler hinzufügen, bis das Team geschlossen ist.

Alles funktioniert mit diesem Code:

fight.get('teams').then((all_teams) => { 
    let count_teams = all_teams.get('length'); 

    if (count_teams > 0) { 
     let last_team = all_teams.objectAt(count_teams - 1); 
     if (last_team.get('closed') === false) { 
      saveNewPlayer(last_team); 
     } else { 
      saveNewTeam(); 
     } 
    } else { 
     saveNewTeam(); 
    } 

    function saveNewTeam() { 
     let new_team = store.createRecord('team', { 
      fight: fight 
     }); 
     new_team.save().then((new_team) => { 
      saveNewPlayer(new_team); 
     }).catch(() => { 
      new_team.rollbackAttributes(); 
     }); 
    } 

    function saveNewPlayer(last_team) { 
     let newPlayer = store.createRecord('player', { 
      team: last_team 
     }); 
     newPlayer.save().then(() => { 
      // handle aftersave 
     }).catch(() => { 
      newPlayer.rollbackAttributes(); 
     }); 
    } 

}); 

Aber es gibt ein Problem, wenn die Internet-Verbindung mit dem Server langsam ist.

Wenn ich den Code viele Spitznamen klicken Sie auf den aktuellen Status des Kampfes überprüft, heißt es: „Keine Teams offen (verfügbar) hier, ich brauche eine neue“ und wie man sich vorstellen kann (weil Internet beschissen) Es erstellt viele Teams mit nur einem Spieler, so viele wie ich jeden Spitznamen angeklickt habe.

Wie kann ich das beheben?

Ich brauche so etwas wie eine Warteschlange?

Vielleicht kann ich auf einen Spieler klicken und dann während des Checks, wenn ich noch einmal klicke, kann ich den nächsten Spieler anstellen? Aber ich muss sofort die Liste der hinzugefügten Spieler zeigen.

Wie?

+0

Diese Art von Logik wird am besten auf dem Server aufbewahrt (um festzustellen, ob ein neues Team benötigt wird). Sie würden die gleichen Probleme haben, wenn ein anderer Benutzer es gleichzeitig versuchte. Lassen Sie den Server entscheiden, ob ein neues Team benötigt wird. –

+0

Danke steve, und wie geht man in der Zwischenzeit mit den neuen Spielern um? Weil ich die Liste sofort zusammenstellen muss ... –

Antwort

0

Um zu verhindern, dass viele Anfragen an den Server gesendet werden, sollten Sie besser die nächsten Anfragen verhindern. Es gibt Alternativen wie das Deaktivieren der Schaltfläche, das Ignorieren der nächsten Aktionen usw.

Wir verwenden ember-concurrency Addon für solche Anwendungsfälle. Es fallen deutlich die nächsten Aktionen.

+0

Danke @ykaragol, aber wie geht man in der Zwischenzeit mit den neuen Spielern um? Weil ich die Liste sofort zusammenstellen und zeigen muss ... –

+0

Ist es ein Problem für Benutzer? Sie können einen Ladespinner einsetzen? – ykaragol

Verwandte Themen