在Meteor应用程序中导航离开并返回页面后,项目未从阵列中拉出

时间:2015-06-11 16:46:15

标签: mongodb meteor coffeescript

因此,在我的Meteor应用程序中,用户可以将自己添加到比赛中或自行删除。请参阅以下Meteor.methods代码:

update_users_array: ( id, user ) ->

    if RaceList.find( _id: id, users: $elemMatch: _id: user._id ).fetch().length > 0

        RaceList.update id, $pull: users: user

    else

        RaceList.update id, $push: users: user

以下是调用此方法的模板事件助手:

Template.race.events

    'click .join-race-btn': ( event ) ->

        Meteor.call 'update_users_array', @_id, Meteor.user()

只要用户不离开页面,但只要他们离开页面并返回并尝试删除自己,它就不再有效了。代码正在执行,但用户未被删除。

真的不确定我在哪里出错了所以任何帮助都会受到赞赏。

感谢。

1 个答案:

答案 0 :(得分:1)

我不完全确定为什么会失败。这可能是因为您正在存储用户对象而不是ID,并且它们的字段必须完全相同才能使更新生效。我强烈建议您重新设计架构以使用ID数组而不是对象。它的空间效率更高,避免了移除时的平等问题,并且通常是最佳实践。

我会按如下方式重写方法:

update_users_array: (id) ->
  # ensure id is a string
  check id, String

  # you must be logged in to call this method
  unless @userId
    throw new Meteor.Error 401, 'You must be logged in'

  # fetch the RaceList we are about to modify
  raceList = RaceList.findOne id

  # ensure this is a valid list
  unless raceList
    throw new Meteor.Error 404, 'The list was not found'

  if _.contains raceList.users, @userId
    # remove this user from the list
    RaceList.update id, $pull: users: @userId
  else
    # add this user to the list and prevent duplicates
    RaceList.update id, $addToSet: users: @userId