2017-06-19 73 views
0

我有这些模型:Ember.js 2,多点击,多关系,如何处理多次点击?

扑灭

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

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

球员

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

昵称

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

现在我在的拼页和我所有的昵称列表并与每一个点击,我需要:

  • 如果没有队伍已经在战斗(这个模型)我创建一个团队,然后我插入我的球员在该团队;
  • 如果队伍已经在战斗中,并且“未关闭”,我只需将我的球员插入最后一支球队;
  • 如果有一支球队已经在战斗中并且“已关闭”,我需要为该新球员和所有其他新球员添加一支新球队,直到该球队关闭。

一切正常,此代码:

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(); 
     }); 
    } 

}); 

但是有一个问题,当与服务器的互联网连接速度很慢。

如果我点击很多绰号,代码检查斗争的实际状况,它说:“没有球队开(用)在这里,我需要一个新的”,正如你所想象的(因为互联网是蹩脚的)只用一名球员创造了很多球队,就像我点击每个昵称一样多。

我该如何解决这个问题?

我需要类似队列的东西吗?

也许我可以点击一个玩家,然后在检查过程中如果再次点击我可以排队下一个玩家?但我需要立即显示添加的球员列表。

如何?

+0

这种逻辑最好保存在服务器上(确定是否需要新团队)。如果其他用户同时尝试,则会出现同样的问题。让服务器决定是否需要新的团队。 –

+0

谢谢史蒂夫,以及如何处理新的球员?因为我需要立即撰写清单... –

回答

0

为防止向服务器发送大量请求,最好防止下一次请求。还有其他方法,如禁用按钮,忽略下一步操作等。

我们正在使用ember-concurrency插件用于此类用例。它清楚地表明了下一步的行动。

+0

感谢@ykaragol,但是如何处理新玩家?因为我需要撰写并立即显示列表... –

+0

这是用户的问题吗?你可以加载一个微调器? – ykaragol