Knockout js - проверить, существует ли свойство
Я пытаюсь сделать следующее с нокаутом.
<!-- ko with: address-->
<!-- ko if: address1-->
<span style="display : block">
<span data-bind="varchar : address1"></span>
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->
<!-- /ko -->
Проблема в том, что даже если объект адреса присутствует, он не может содержать параметр address1.
Я бы хотел, чтобы нокаут не отображал вложенные промежутки, если параметр "address1" равен нулю.
В настоящее время выдается следующая ошибка:
Unable to parse bindings. Message: ReferenceError: address1 is not defined;
Любая помощь очень ценится.
Ответы
Ответ 1
Разве это не случай перемещения второй, если?
<!-- ko with: address -->
<span style="display : block">
<!-- ko if: address1 -->
<span data-bind="varchar : address1"></span>
<!-- /ko -->
</span>
<span style="display : block">
<span data-bind="varchar : address2"></span>
</span>
<!-- /ko -->
Похоже, нам нужно увидеть ваш viewModel и как адреса связаны друг с другом. Я могу сделать это на образце с нокаутной страницы без проблем:
<h1 data-bind="text: city"> </h1>
<p data-bind="with: coords">
<!-- ko if: latitude -->
Latitude: <span data-bind="text: latitude"> </span>,
<!-- /ko -->
Longitude: <span data-bind="text: longitude"> </span>
</p>
Ответ 2
Если вы используете <!-- ko if: $data.address1 -->
, тогда он не будет выходить из строя, если address1
- undefined.
Если address1
позже заселяется, он не обновит пользовательский интерфейс, хотя (address1
должен быть первоначально наблюдаемым).
Ответ 3
У меня был случай, когда у меня был шаблон адреса, который вызывается из разных мест, а название страны иногда countryName
, а иногда countryDesc
.
Я просто изменил шаблон на:
<div data-bind="text: $data.countryName || $data.countryDesc"></div>
Это использует тот факт, что если вы используете $data
, он не будет выходить из строя (как указал RP Niemeyer)
Ответ 4
Причиной такого поведения могут быть исходные данные вашего "адреса", наблюдаемые.
Если вы инициализируете свою модель просмотра следующим образом:
this.address = ko.observableArray();
тогда оба "адреса" и "адрес1" undefined.
Обходной путь будет проверять данные в начале блока, завернув код в оператор "ko if", таким образом:
<!-- ko if: $data --> <br/>
<br/>
<span style="display : block"><br/>
<span data-bind="varchar : address1"></span><br/>
</span><br/>
<span style="display : block"><br/>
<span data-bind="varchar : address2"></span><br/>
</span><br/>
<br/>
<!-- /ko -->