有条件地在knockout.js中添加一个元素属性

knockout.js库有一个"attr"数据绑定 ,允许你dynamic地改变一个HTML元素属性的值(例如“title”)。 但是,在某些情况下,取决于绑定对象上相应的可观察属性,该属性可能需要也可能不需要。 例如,如果我的模型有一个“标题”可观察性,如果存在(非空),可能需要设置“标题”属性,如果不存在(空),则可以完全跳过该属性。

敲除提供任何方式来有条件地设置属性? (理想情况下,没有条件地呈现整个元素的开始标记…)

[注]这个类似命名的问题实际上是由knockout的CSS类的特殊处理来解决的,并不涉及这个问题(或者它自己的标题): 如何有条件地渲染一个带有knockoutjs的css类

select一个(我手动生成而不是内置淘汰赛)时,我需要这个。

 <option data-bind="text: text, attr:{ value:value, 'selected': typeof(selected) !== 'undefined' ? selected : null }"> Choice X </option> 

这表示要始终更新“文本”属性并添加“值”属性,但如果数据已经定义了“选定”值,则只添加“选定”属性。

你可以创build一个自定义绑定attrIf ,它会在添加或不添加属性之前检查特定的可观察布尔值的值。 看到这个例子:

 ko.bindingHandlers.attrIf = { update: function (element, valueAccessor, allBindingsAccessor) { var h = ko.utils.unwrapObservable(valueAccessor()); var show = ko.utils.unwrapObservable(h._if); if (show) { ko.bindingHandlers.attr.update(element, valueAccessor, allBindingsAccessor); } else { for (var k in h) { if (h.hasOwnProperty(k) && k.indexOf("_") !== 0) { $(element).removeAttr(k); } } } } }; <a href="#" data-bind="attrIf: {title: title, _if: flag}">link</a> 

Knockout的“attr”数据绑定确实支持这种情况,只是从getDisabledState()函数返回null或undefined,那么它不会发射该属性。

这个答案是从Knockout attr绑定与“只读”和“禁用”

我希望我可以刚刚回复@gbs,但我不能。 我的解决scheme将有两个相同的HTML元素,一个具有属性,一个没有,还有一个淘汰赛条件,根据元素添加一个。 我也知道这个定制的标准,但哪个解决scheme更有效率?