выбранный в опции выбора дает неправильное значение атрибута

#javascript #html #angular

#javascript #HTML #угловой

Вопрос:

Я хочу отобразить выбор со всеми параметрами моего перечисления и изменить значение для обновления моей базы данных. Для этого: у меня есть перечисление:

 export enum SubscriptionEnum {
    DAILY= 'DAILY',
    ANNUAL= 'ANNUAL',
    HALF-YEARLY = 'HALF-YEARLY ',
    QUARTERLY = 'QUARTERLY ',
    MONTHLY = 'MONTHLY ',
}
  

В моем файле .ts я создаю свой enum var:

 SubscriptionEnum = SubscriptionEnum ;
  

И затем я отображаю этот параметр в my .html:

 <p>{{client.subscription}}</p> // here it display what is registered in my db, in this case "ANNUAL"
<label for="subscription">Subscription:</label>
<select #subscriptionid="subscription">
   <option value="{{option.key}}"
           *ngFor="let option of SubscriptionEnum | keyvalue">
           {{option.value}}
   </option>
</select>
  

В этом примере я выбираю опцию «Выбрать со всеми» и изменяю значение на странице просмотра, когда я нажимаю на новую опцию.

Затем я добавляю (изменение) в select для вызова метода, который изменяет содержимое клиентской подписки в БД. Я сделал это так: .html:

 <p>{{client.subscription}}</p> // here it display what is registered in my db, in this case "ANNUAL"
<label for="subscription">Subscription:</label>
<select (change)="changeInfo(subscription )" #subscription id="subscription">
   <option value="{{option.key}}"
           *ngFor="let option of SubscriptionEnum | keyvalue">
            {{option.value}}
   </option>
</select>
  

В моем changeInfo я отправляю событие и принимаю event.id и event.value для обновления моей базы данных, и это работает, потому что опция выбора меняется, когда я нажимаю на нее, и <p>{{client.subscription}}</p> значение, которое является значением моей базы данных, принимает хорошее значение.

Затем я хотел добавить селектор, чтобы значение моего параметра принимало непосредственно правильное значение, и это не работает… Я добавляю это так:

 <p>{{client.subscription}}</p> // here it display what is registered in my db, in this case "ANNUAL"
    <label for="subscription">Subscription:</label>
    <select (change)="changeInfo(subscription )" #subscription id="subscription">
       <option value="{{option.key}}"
               selected="{{option.key == client.subscription}}"
               *ngFor="let option of SubscriptionEnum | keyvalue">
                {{option.value}}
       </option>
    </select>
  

Это выделяет мое предложение и сообщает мне «Неправильный метод атрибута», и когда я перезагружаю свою страницу, моя

div содержит хорошее значение, которое является «ГОДОВЫМ», но мой вариант равен КВАРТАЛЬНОМУ. Если я нажму, чтобы изменить параметр, правильное значение будет сохранено в моей базе данных, но отображение моего селектора выбора будет неправильным.

Чего я не понимаю? Спасибо за вашу помощь

Ответ №1:

Существует тонкая разница между двумя похожими угловыми синтаксисами:

 selected="{{option.key == client.subscription}}"
  

и

 [selected]="option.key == client.subscription"
  

Существуют обе привязки свойств, но первая присваивает свойству интерполированное значение.

Это означает, что даже в случае ложных значений selected свойство получит true ;

 el.selected = 'false'
  

потому string что это истинное значение в js.

Таким образом, вы можете рассмотреть следующие варианты:

  • Используйте правильную привязку свойства:

      [selected]="option.key == client.subscription"
      
  • Вместо этого используйте value привязку к <select> тегу:

      <select #subscription id="subscription" [value]="client.subscription">
       <option value="{{option.key}}"
           *ngFor="let option of SubscriptionEnum | keyvalue">
           {{option.value}} {{option.key == client.subscription}}
       </option>
     </select>