не может прочитать свойство неопределенного углового6 [дубликат]

Попробуйте со следующим:

Часть HTML:

<div id="outher">
    <div id="inner">

    </div>
</div>

Часть CSS:

#outher {
    width: 1000px;
    height: 1000px;
    background-color: #ccc;
}

#inner {
    width: 400px;
    height: 300px;
    background-color: #090;
    left: 50%;  
    margin:0 auto;
    position: absolute;
}

Я думаю это может помочь вам решить вашу проблему.

32
задан Kashif Faraz Shamsi 20 September 2017 в 13:11
поделиться

5 ответов

Выбранная переменнаяHero имеет значение null в шаблоне, поэтому вы не можете привязать выбранноеHero.name как есть. Вам нужно использовать оператор elvis для этого случая:

<input [ngModel]="selectedHero?.name" (ngModelChange)="selectedHero.name = $event" />

Разделение [(ngModel)] в [ngModel] и (ngModelChange) также необходимо, потому что вы не можете назначить выражение который использует оператор elvis.

Я также думаю, что вы хотите использовать:

<h2>{{selectedHero?.name}} details!</h2>

вместо:

<h2>{{hero.name}} details!</h2>
75
ответ дан Guilherme Meireles 16 August 2018 в 02:00
поделиться
  • 1
    Спасибо. Вы, как правило, идентифицировали проблему. Однако у меня все еще есть проблемы. Я изменил {{hero.name}} на {{selectedHero.name}}, но все равно получаю ту же ошибку. Я также обновил ввод, как вы указали, но ошибка сохраняется. Когда & lt; вход & gt; строка тега прокомментирует все, кроме & lt; h2 & gt; {{selectedHero.name}} детали! & lt; / h2 & gt; работает нормально. Поэтому я знаю, что выбранный объектHero используется неправильно. – user 28 September 2016 в 19:23
  • 2
    Извините, я забыл оператора elvis по коду. Я отредактировал ответ. Это должно быть: {{selectedHero? .Name}} – Guilherme Meireles 28 September 2016 в 19:27
  • 3
    Потрясающие! Я только что добавил ?, и мой код работает отлично. – Nhan 22 March 2017 в 08:39
  • 4
    Спасибо, добавив ? после того, как мое свойство исправило мою проблему для привязки условных данных, если свойство существует. Можете ли вы рассказать о том, что вы подразумеваете под because you can't assign to an expression that uses the elvis operator.. Я не делал ничего из этого ngModelChange, который вы описали, и мой оператор elvis отлично работает, как [value]="this.data?.office?.name" – TetraDev 25 August 2017 в 21:46
  • 5
    @TetraDev Ваш пример работает, потому что это просто директива привязки данных [], а не привязка к событию (). Было бы неплохо, если бы угловой проанализировал заявление и идентифицировал эти случаи, но в настоящее время этого не происходит. См. github.com/angular/angular/issues/7697 – Ulfius 20 September 2017 в 23:43

Это позволяет избежать инициализации выбранного элементаHero вашего компонента пустым объектом (вместо того, чтобы оставить его неопределенным).

В вашем примере кода это даст следующее:

export class AppComponent {
  title = 'Tour of Heroes';
  heroes = HEROES;
  selectedHero:Hero = new Hero();

  onSelect(hero: Hero):void{
      this.selectedHero = hero;
  }
}
2
ответ дан Cédric Françoys 16 August 2018 в 02:00
поделиться

Эта строка

<h2>{{hero.name}} details!</h2>

находится вне *ngFor, и нет hero, поэтому hero.name не работает.

2
ответ дан Günter Zöchbauer 16 August 2018 в 02:00
поделиться

Вы получили эту ошибку, потому что следовали плохо написанным указаниям в учебнике Heroes. Я столкнулся с тем же.

В частности, под заголовком Отображать имена героев в шаблоне , он указывает:

Чтобы отобразить героя имена в неупорядоченном списке, вставьте следующий фрагмент HTML под заголовком и над деталями героя.

, за которым следует этот код:

<h2>My Heroes</h2>
<ul class="heroes">
  <li>
    <!-- each hero goes here -->
  </li>
</ul>

Он делает не инструктируйте вас заменить предыдущий детальный код, и он должен. Вот почему мы остались с:

<h2>{{hero.name}} details!</h2>

вне нашего *ngFor.

Однако, если вы прокрутите страницу вниз, вы увидите следующее:

Шаблон для отображения героев должен выглядеть так:

<h2>My Heroes</h2>
<ul class="heroes">
  <li *ngFor="let hero of heroes">
    <span class="badge">{{hero.id}}</span> {{hero.name}}
  </li>
</ul>

Обратите внимание на отсутствие элементов детализации из предыдущих попыток.

Ошибка, подобная этой автору, может привести к довольно дикой гусиной погоне. Надеюсь, этот пост помогает другим избежать этого.

4
ответ дан Josh Cronkhite 16 August 2018 в 02:00
поделиться

Вам просто нужно было прочитать немного дальше, и вы бы познакомились с структурной директивой * ngIf.

selectedHero.name еще не существует, поскольку пользователю еще предстоит выбрать героя, чтобы он возвращает undefined.

<div *ngIf="selectedHero">
  <h2>{{selectedHero.name}} details!</h2>
  <div><label>id: </label>{{selectedHero.id}}</div>
  <div>
    <label>name: </label>
    <input [(ngModel)]="selectedHero.name" placeholder="name"/>
  </div>
</div>

Директива * ngIf сохраняет selectedHero от DOM до тех пор, пока она не будет выбрана и, следовательно, станет правдой.

Этот документ помог мне понять структурные директивы.

14
ответ дан Tom 16 August 2018 в 02:00
поделиться
  • 1
    Это помогло мне получить то, что я искал, спасибо +1 – Gman 9 March 2017 в 23:14
  • 2
    Да, я тоже, я застрял, чтобы отредактировать «список». – Carnaru Valentin 1 October 2017 в 10:09
  • 3
    Это помогло мне. Это имеет смысл после факта, так как мой компонент пытается отобразить объект, который заполняется, когда операция async завершается. Благодаря! – Generaldeep 18 June 2018 в 14:37
Другие вопросы по тегам:

Похожие вопросы: