7

对于某些属性,属性的存在会产生影响——分配给它的值是无关紧要的。例如,可以将 autofocus 属性设置为“false”或“true”或“banana”,并且元素仍会自动获得焦点。IE,以下都是等效的,并导致 div 获得焦点:

<div autofocus="false" contenteditable="true"></div>
<div autofocus="true" contenteditable="true"></div>
<div autofocus="banana" contenteditable="true"></div>

Knockout 有一个 'attr' 绑定,但它似乎只用于为属性分配值,而不是用于添加/删除属性。

是否有另一种方法可以在淘汰赛中做到这一点,还是我被迫从 javascript 设置它?

注意 在 ubuntu 上使用 chrome。

4

4 回答 4

6

使用布尔 false 值删除属性,使用字符串“false”设置属性。你还需要什么?

例如:

// Set as boolean, removes the attribute
autofocus(false);   

// Set as boolean, adds the attribute
autofocus(true);  

// Set as string, adds the attribute
autofocus('false');   

// Set as string, adds the attribute
autofocus('true');   

见这里的例子:http: //jsfiddle.net/badsyntax/XMDFh/

于 2013-04-23T11:24:17.467 回答
1

您可以使用hasfocus淘汰赛绑定:

<input data-bind="hasfocus: isSelected" />

在这里阅读更多:http: //knockoutjs.com/documentation/hasfocus-binding.html

于 2012-08-16T14:20:36.397 回答
0

您可以编写一个使用 jquery 删除属性的 kohandler。

于 2013-04-22T01:46:00.923 回答
0

Knockout 中没有用于添加或删除属性的本机绑定,仅用于设置属性。

绑定展示其行为的原因hasFocus是因为它使用元素的本机.focus().blur()方法来添加或删除焦点。

以前曾报道过难以管理非布尔属性的淘汰赛,这是 Michael Best 提到不会解决的一个示例:

https://github.com/SteveSanderson/knockout/issues/391

更新:

您可以按照以下方式创建绑定处理程序:

ko.bindingHandlers.toggleAttr = {    
    update: function (element, valueAccessor) {    
        var options = ko.utils.unwrapObservable(valueAccessor());
        var attr = ko.utils.unwrapObservable(options.attr);
        var param = ko.utils.unwrapObservable(options.param);

        param ? element.setAttribute(attr, true) : element.removeAttribute(attr);        
    }
};

这将允许你这样做:

<input data-bind="toggleAttr: { attr: 'autofocus', param: focusMe }" />

这是一个小提琴:http: //jsfiddle.net/nathanjones/9EzBD/

于 2013-04-22T22:05:32.093 回答