保存当前用户值以在HTML

时间:2016-10-11 13:49:56

标签: javascript meteor

[编辑]我正在使用Meteor

大家好,

我搜索并尝试过很多东西,但我不能做我想要的。 我正在做一个ToDo列表的教程,当你检查一个任务时,我想把检查任务的用户的名字。

  <template name="task">
      <li class="{{#if checked}}checked{{/if}}">{{#if checked}}<!-- the name of the user who checked it -->{{/if}}
     <!-- the rest isn't useful for my question -->

我尝试使用{{currentUser.username}},但当我与其他人登录时,名称会更改...

事件处理程序的JS是

  'click .toggle-checked'() {
    // Set the checked property to the opposite of its current value
    Meteor.call('tasks.setChecked', this._id, !this.checked);
  }

方法调用的JS

  'tasks.setChecked'(taskId, setChecked) {
    check(taskId, String);
    check(setChecked, Boolean);
    Tasks.update(taskId, { $set: { checked: setChecked } });
  }

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

如果您使用{{currentUser.username}},您将始终拥有登录用户的数据。

要获得您想要的内容,您需要注册在您的方法中检查任务的用户的_id

'tasks.setChecked'(taskId, setChecked) {
  check(taskId, String);
  check(setChecked, Boolean);

  // Check that 'setChecked' is true and that the user is logged in,
  // Otherwise just update the status
  if (setChecked && this.userId) {
    Tasks.update(taskId, {
      $set: {
        checked: setChecked,
        userId: this.userId,
      }
    });
  } else {
     Tasks.update(taskId, {
      $set: {
        checked: setChecked,
      }
    });
  }
}

如果您使用的是架构,请确保相应地更新架构。

然后在您的模板中,检索用户数据并显示它:

// file task.js
import './task.html';

Template.task.helpers({
  checkerUser() {
    // The template data are those of the current task, check if userId is defined and task is checked
    const { userId, checked } = Template.currentData();
    /* Or you can do
     * const userId = Template.currentData().userId;
     * checked = Template.currentData().checked;
     */
    if (userId && checked) {
      return Meteor.users.findOne({ _id: userId }).profile.username;
    }
    return null;
  }
});

Template.task.events({
  'click .toggle-checked'() {
    // Set the checked property to the opposite of its current value
    Meteor.call('tasks.setChecked', this._id, !this.checked);
  }
})

最后是HTML:

// file task.html
<template name="task">
  <li class="{{#if checked}}checked{{/if}}">
    {{#if checkerUser}}Completed by {{checkerUser}}{{/if}}
  </li>
</template>

从技术上讲,在您的方法中,您还应该检查更多不同情况。例如,当您取消选中任务时,它应该从记录中删除userId,这样如果非登录用户再次检查它,该名称将不是第一个用户的名称(或者您可以如果用户在设置$unset

时未登录,则为checked = true userId