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

Нокаут JS: проверка наличия наблюдаемого в привязке IF

Я представляю аналогичный блок HTML для нескольких немного разных объектов. Они на 90% одинаковы, но у каждого есть определенные особенности, требующие дополнительных наблюдаемых. Я хотел бы отобразить каждый из этих наиболее похожих элементов в блоке шаблона, но у меня возникают проблемы с объектами undefined.

В принципе, я хочу проверить наличие наблюдаемого объекта перед его отображением в шаблоне.

Я пытаюсь сделать что-то вроде этого:

<div data-bind="foreach: blocks">
<h2 data-bind="text: normalHeader"><h2>
<p data-bind="text: normalText"></p>
<!-- ko if: specialText --><p data-bind="text: specialText"></p><!-- /ko -->
</div>

Поэтому, если specialText не существует (не просто не имеет значения, но вообще не существует) для этой итерации blocks, игнорируйте условное выражение. Ошибка, которую я получаю:

Uncaught Error: Unable to parse bindings.
Message: ReferenceError: specialText is not defined;

Из того, что я понимаю о привязке "если", но должно быть выполнено, если объект возвращает любое значение типа false, например null или undefined, что означает, что привязка if должна изящно терпеть неудачу, что определенно не является "т.

Есть ли способ сделать эту работу?

4b9b3361

Ответ 1

Вы можете использовать следующий подход:

<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: $data.hasOwnProperty("Bar") -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->​

Я опубликовал рабочую демонстрацию

Ответ 2

<!-- ko if: typeof specialText != 'undefined' -->

На основе решения Oybek вы также можете:

<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: "Bar" in $data -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->​

Пример: http://jsfiddle.net/MecNx/56/

Ответ 3

Вы можете сделать это, обратившись через индексатор объектов:

<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: $data["Bar"] -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->

Ответ 4

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

<!-- ko if: specialText != null -->

ko распознает его как выражение, а не значение, и поэтому он должен работать так, как вы хотите:)