Meteor Autoform `this.field(keyName).value` возвращает неопределенное значение в схеме

У меня есть Person, и я хочу, чтобы поле fullName и значение автоматически создавались, когда человек меняет свои поля firstName или lastName.

People.attachSchema(new SimpleSchema({
    firstName: {
        type: String,
        optional: false,
        label: 'First Name'
    },
    lastName: {
        type: String,
        optional: false,
        label: 'Last Name'
    },
    fullName: {
        type: String,
        optional: false,
        label: 'Full Name',
        autoValue: function() {
          var firstName = this.field("firstName");
          var lastName = this.field("lastName");

          if(firstName.isSet || lastName.isSet){
                return firstName.value + " " + lastName.value;
            } else {
                this.unset();
            }
          }
    }
}));

Если я тогда сделаю

People.update("ZqvBYDmrkMGgueihX", {$set: {firstName: "Bill"}})

fullName установлен как Bill undefined

Что я делаю не так?


person fuzzybabybunny    schedule 14.03.2016    source источник


Ответы (1)


Прямо сейчас ваше условие firstName.isSet || lastName.isSet говорит, что если в документе есть firstName или lastName, то создайте fullName. Таким образом, полное имя назначается правильно, так как одно из них установлено (Имя установлено на Билл). Вам нужно использовать && вместо || вот так.

People.attachSchema(new SimpleSchema({
    firstName: {
        type: String,
        optional: false,
        label: 'First Name'
    },
    lastName: {
        type: String,
        optional: false,
        label: 'Last Name'
    },
    fullName: {
        type: String,
        optional: false,
        label: 'Full Name',
        autoValue: function() {
            var firstName = this.field("firstName");
            var lastName = this.field("lastName");

            if(firstName.isSet && lastName.isSet){
                return firstName.value + " " + lastName.value;
            } else {
                this.unset();
            }
        }
    }
}));

Но, исходя из вашего вопроса, я думаю, вы хотите установить fullName только при обновлении одного из firstName или lastName, тогда, я думаю (я не уверен), вам нужно проверить this.field('firstName').operator, чтобы проверить, является ли он $set в текущей операции или не.

person Kishor    schedule 14.03.2016
comment
Круто, это сработало. Я немного запутался в том, что на самом деле означает this.field("someField"). Когда объект вставляется в People, устанавливаются только firstName и lastName. Так всегда ли this.field("firstName") относится к значению во время любой операции Create или Update? - person fuzzybabybunny; 17.03.2016
comment
@fuzzybabybunny да, this.field("firstName").value всегда относится к значению, независимо от того, установлено ли оно во время текущей или предыдущей операции. - person Kishor; 17.03.2016
comment
Хммм, хорошо, значит, функции в autoValue не нужен какой-то триггер/событие для запуска? - person fuzzybabybunny; 17.03.2016
comment
@fuzzybabybunny autoValue будет работать всякий раз, когда ваша схема cleaned. Очистка будет выполнена автоматически перед Update или Insert, или вы можете очистить ее, явно вызвав ее. - person Kishor; 17.03.2016