Knockout.js 是否可以在templatebinding中添加可选的绑定参数?

Knockout.js 是否可以在templatebinding中添加可选的绑定参数?,knockout.js,jquery-templates,Knockout.js,Jquery Templates,我正忙着为一个中型项目创建模板。我在jquery模板引擎中使用knockoutjs,一切都很顺利。我将一些模板嵌套在几个层次的深处。 现在我想向一些模板添加可选的绑定参数。这是我对html表中根模板的绑定: <tr data-bind="template: { name: 'RowTextboxTemplate', data: { caption: 'Transporter', property: Transporter } }" /> 这是rowtextboxtemplate

我正忙着为一个中型项目创建模板。我在jquery模板引擎中使用knockoutjs,一切都很顺利。我将一些模板嵌套在几个层次的深处。 现在我想向一些模板添加可选的绑定参数。这是我对html表中根模板的绑定:

<tr data-bind="template: { name: 'RowTextboxTemplate', data: { caption: 'Transporter', property: Transporter } }" />

这是rowtextboxtemplate模板:

<td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
<td data-bind="template: { name: 'TextboxTemplate', data: { field: property } }" />
    <td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
{{if readOnly !== undefined}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: readOnly } }" />
{{else}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: false } }" />
{{/if}}

这是其中一个子模板textboxtemplate:

<td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
<td data-bind="template: { name: 'TextboxTemplate', data: { field: property } }" />
<input data-bind="value: field, valueUpdate: 'afterkeydown'" type="text">
    <td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
{{if readOnly !== undefined}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: readOnly } }" />
{{else}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: false } }" />
{{/if}}

现在,我想这样做:

<tr data-bind="template: { name: 'RowTextboxTemplate', data: { caption: 'Transporter', property: Transporter, readOnly: IsTransporterReadOnly } }" />

但是,我希望它是可选的,因此当省略最后一个属性时,它仍然可以工作。我之所以要这样做,是因为有很多字段不需要这个参数,所以它会污染我的HTML。 我在根模板中尝试了以下操作:

<td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
<td data-bind="template: { name: 'TextboxTemplate', data: { field: property } }" />
    <td data-bind="template: { name: 'CellLabelTemplate', data: { caption: caption, property: property } }" />
{{if readOnly !== undefined}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: readOnly } }" />
{{else}}
 <td data-bind="template: { name: 'CellComboboxTemplate', data: { options: property, selectedValue: selectedValue, optionsText: optionsText, readOnly: false } }" />
{{/if}}

{{如果只读!==未定义}
{{else}
{{/if}

接下来,我将readonly属性绑定到子模板中的readonly属性,但不幸的是,这不起作用。还有其他方法吗?

您可以做的一件事是在绑定中使用
$data.readOnly
,因为如果readOnly未定义,它不会出错,因为您是从对象访问它的

这里将对此进行更详细的描述:


这是您最新的小提琴:

如果能让小提琴演奏起来可能会很好。您可以做的一件事是在绑定中使用
$data.readOnly
,因为如果
readOnly
未定义,则不会出错,因为您是从对象访问它。感谢$data提示!这解决了问题。我为它做了一把小提琴,在你的答案中引用它,我将把它标记为已解决。