Подтвердить что ты не робот

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;

Любая помощь очень ценится.

4b9b3361

Ответ 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 -->