2012-10-18 48 views
40

knockout.js库有一个"attr" data binding,它允许您动态更改HTML元素属性(例如“title”)的值。但是,在某些情况下,取决于绑定对象上的相应observable,该属性可能需要也可能不需要。例如,如果我的模型具有“标题”可观察性,如果存在(非空),可能需要设置“title”属性,如果不存在(空),则可以完全跳过该属性。有条件地在knockout.js中添加元素属性

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

[注]此类似命名的问题其实是淘汰赛的CSS类的特殊处理解决,并没有涉及到这个问题(或自己的标题) :How to conditionally render an css class with knockoutjs

+1

检索我认为这是默认的行为,如果观察到的返回null,但我可能是错的。我可以问你为什么你需要显式地不设置属性而不是title =“”以防空值? –

回答

67

我在选择(我手动生成而不是内置淘汰赛)时需要此选项。

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

这是说,始终更新“文本”属性,并增加了“价值”属性,但只能加“选择”,如果该数据已经拥有“选择”中定义的值。

+6

所以基本上把'空'作为属性值,它不会渲染属性,很好! – root

+2

这应该是有效的答案。它以最简单的方式完美地回答了问题。 –

+1

我同意这应该是被接受的答案。虽然创建自定义绑定绝对有效,但这更简单,并且更直接地解决了问题。 – kiprainey

29

您可以创建自定义绑定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> 
+0

辉煌但一个严重的问题 - 如果我有一个属性,而不是'标题',我不想_if适用于它... _if仍然会。尽管如此,代码思想还是不错的。 – Phil

+5

您可以使用ko标准的'attr'绑定(不受_if标志影响)添加其他属性。例如:data-bind =“attrIf:{title:title,_if:flag},attr:{otherAttr:val}” – gbs

+0

我会建议在底部附近有更多的逻辑删除...如果这个答案不起作用,如果您希望有条件地覆盖该元素上已存在的属性。图片如下 MrTristan

2

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

+0

如果你对同一个元素有5个不同的属性,你会怎么做?很多乐趣的透视... – Samuel

相关问题