Я изучаю веревки Метеора и как бы потерялся здесь. Я использую collection2, автоформу для создания своего приложения. Я хочу сохранить коллекцию вместе с информацией об идентификаторе пользователя. Поэтому, когда мы получаем коллекцию с сервера, я хочу показывать только те, которые создал пользователь, а не все остальное. вот схема.

    ExercisesSchema = new SimpleSchema({
    "name": {
        type: String,
        label: 'Name'
    },
    "workout.$.weight": {
        type: String,
        label: 'Weight'
    },
    "workout.$.reps": {
        type: String,
        label: 'Reps'
    },
    "notes": {
        type: String,
        label: 'Notes',
        optional: true
    }
});

На стороне сервера я хочу показать только тренировки, созданные пользователем

Meteor.publish('exercises', function () {
    return Exercises.find({owner: this.userId});
});

Когда я добавил идентификатор пользователя в схему, он отображается в автоформе, я не уверен, как его скрыть, если я скрою, то, возможно, я смогу использовать хуки в автоформе для добавления значений?

1
Nair 28 Окт 2015 в 05:34

2 ответа

Лучший ответ

В схеме вы можете определить ownerId как тип: "скрытый"

schema.js

ExercisesSchema = new SimpleSchema({
    "name": {
        type: String,
        label: 'Name'
    },
    "ownerId": {
        type: String,
        autoform: {
            type: "hidden",
        }
    },
    "workout": {
        //not sure if you need this, you didn't have it in your
        type: [Object], 
        defaultValue: [] 
    },
    "workout.$.weight": {
        type: String,
        label: 'Weight'
    },
    "workout.$.reps": {
        type: String,
        label: 'Reps'
    },
    "notes": {
        type: String,
        label: 'Notes',
        optional: true
    }
});

И заполните его крючками, как вы сказали.

autoFormHooks.js

AutoForm.hooks({
  exerciseForm: {
    formToDoc: function(doc) {
      doc.ownerId = Meteor.userId();
      return doc
    },
  }
});

Альтернативой использованию хуков было бы использование quickFields внутри вашей autoForm для каждого поля, которое вы хотите установить в документе, включая ownerId. С помощью этого решения вы должны установить value ownerId равным currentUser.

{{#autoForm collection="Exercises" id="exerciseForm" type="insert"}}
  <fieldset>
    <legend>Add an Exercise</legend>
    {{> afQuickField name='name'}}
    {{> afQuickField name='notes'}}
    {{> afQuickField name='ownerId' value=currentUserId}}
    {{> afQuickField name='workout'}}
  </fieldset>
  <button type="submit" class="btn btn-primary">Insert</button>
{{/autoForm}}

< Сильный > template.js

Template.formTemplate.helpers({
    currentUserId: function () {
        return Meteor.userId();
    }
});
5
challett 28 Окт 2015 в 04:26

Вы можете попробовать ловушку before:

ExercisesSchema = new SimpleSchema({
...
    "ownerId": {
        type: String,
        autoform: {
            type: "hidden",
        }
    },
...
});

В вашем шаблоне:

{{#autoForm collection="Exercises" id="exerciseForm" type="insert"}}
  <fieldset>
    <legend>Add an Exercise</legend>
    {{> afQuickField name='name'}}
    {{> afQuickField name='notes'}}
    <!-- Notice I've removed the ownerId from here. Will be added before saving to collection -->
    {{> afQuickField name='workout'}}
  </fieldset>
  <button type="submit" class="btn btn-primary">Insert</button>
{{/autoForm}}

Тогда ваш autoform.js

var addUserHook = {
  before: {
    insert: function(doc) {
      if(Meteor.userId()){
        doc.ownerId = Meteor.userId();
      }

      return doc;
    }
  }
}

AutoForm.addHooks('exerciseForm', addUserHook);

Вышеупомянутое добавляет ownerId на лету, когда мы собираемся сохранить в коллекцию.

Как указано в документации на mospherejs.com/aldeed/autoform :

Например, вы можете захотеть добавить идентификатор текущего пользователя в документ перед его вставкой. Для этого вы можете использовать хуки «before», «formToDoc» или «formToModifier».

0
KhoPhi 16 Дек 2015 в 22:20