0

У меня есть Person и я хочу fullName поле и значение автоматически создается, когда человек меняет свои firstName или lastName поля.Метеор Автоформа `this.field («KEYNAME»). Value` возвращает неопределенное значение в схеме

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

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

ответ

1

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

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 в текущей операции или нет.

+0

Удивительно, что сработало. Я немного смущен тем, что 'this.field (« someField ») на самом деле ссылается. Когда объект вставляется в «Люди», устанавливаются только «firstName» и «lastName». Таким образом, 'this.field (" firstName ")' всегда ссылается на значение во время любой операции 'Create' или' Update'? – fuzzybabybunny

+1

@fuzzybabybunny yes, 'this.field (" firstName "). Value' всегда ссылается на значение независимо от того, установлено ли оно во время текущей операции или предыдущей операции. – Kishor

+0

Хммм, хорошо, поэтому функция в 'autoValue' не нуждается в каком-то триггере/событии для ее запуска? – fuzzybabybunny

Смежные вопросы