Knockoutjs привязки if и ifnot не работают должным образом при использовании внутри шаблона

Я использую следующий шаблон с нокаутом js

<tbody data-bind="foreach: List">
            <tr>
                <td><input type="button" data-bind="if: ($parent.IsFVL || $parent.AllowChat || $root.Me().AllowChatMonitoring), value: ID, click: SelectVisit" /><span data-bind="ifnot: ($parent.IsFVL || $parent.AllowChat || $root.Me().AllowChatMonitoring), text: ID"></span></td>...

и вызов/инициация шаблона, подобного этому

<div data-bind="template: { name: 'tplVisitsGrid', data: { Title: 'My Visits', 'List': MVL, 'AllowChat': true, 'AllowPing': false, 'IsFVL': false } }"></div>

Также я дважды проверил, что значение "$root.Me().AllowChatMonitoring" истинно, но оба input[type=button] и span рендерятся. Что я мог упустить?


person Liono    schedule 24.12.2012    source источник


Ответы (2)


Поскольку вы объединяете несколько свойств в if и ifnot, вам необходимо их оценить. Попробуйте это (при условии, что IsFVL, AllowChat и AllowChatMonitoring все наблюдаемы - они должны быть):

<td><input type="button" data-bind="if: ($parent.IsFVL() || $parent.AllowChat() || $root.Me().AllowChatMonitoring()), value: ID, click: SelectVisit" /><span data-bind="ifnot: ($parent.IsFVL() || $parent.AllowChat() || $root.Me().AllowChatMonitoring()), text: ID"></span></td>...

Что на самом деле происходило раньше, так это то, что сравнивались 3 функции, а не возвращаемые значения функций.

person xdumaine    schedule 24.12.2012
comment
Эти свойства не наблюдаемы, поэтому ваше предложение не сработает. - person Artem Vyshniakov; 24.12.2012
comment
@ArtemVyshniakov, чтобы они работали в привязке If, они должны быть наблюдаемыми - person xdumaine; 24.12.2012

Вы не должны использовать $parent при доступе к IsFVL, AllowChat и т. д. Попробуйте обновить свой шаблон следующим образом:

<input type="button" data-bind="if: (IsFVL || AllowChat || $root.Me().AllowChatMonitoring), value: ID, click: SelectVisit" />
<span data-bind="ifnot: (IsFVL || AllowChat || $root.Me().AllowChatMonitoring), text: ID"></span></td>

Если это не поможет, создайте скрипт со своей проблемой.

person Artem Vyshniakov    schedule 24.12.2012
comment
Спасибо за ответ, свойства IsFVL и AllowChat не являются наблюдаемыми, причина того, что я не делаю их наблюдаемыми, заключается в том, что я загружаю шаблон три раза с разными значениями этих свойств, поэтому я не мог найти способ добавить их как наблюдаемые к моей модели. Я проверил, что другие простые выражения javascript оцениваются в привязках нокаута, например если, если нет, видны, но эти реквизиты не были. Я создам скрипт для этого и опубликую. - person Liono; 24.12.2012