Knockoutjs Custom Binding style child

时间:2012-12-14 10:21:01

标签: knockout.js ko-custom-binding

我有自定义绑定。

<div data-bind="autocomplete : { inputStyle : { marginRight : marginR }}"></div>

在我的init函数中我这样做。我添加了一个我需要设置样式的输入框。

$element.append("<input type='text' data-bind='style='" + value.inputStyle + "' />");

我知道这不行,但请有人帮我做正确的事。

2 个答案:

答案 0 :(得分:1)

以下是执行您请求的自定义绑定:

function toStyleStr (obj) {
    var result = "";
    $.each(obj, function (k,v) {
        result += k.toString() + ": " + ko.utils.unwrapObservable(v).toString() + ";"; 
    });    
    return result;               
}

ko.bindingHandlers.autocomplete = {
    init: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor()),
            $element = $(element);
        $element.append("<input type='text' style='" + toStyleStr(value.inputStyle) + "' />");     
    }            
};

var model = {
    marginR: ko.observable("10px")
};
ko.applyBindings(model);

这是一个工作小提琴:http://jsfiddle.net/RYnbR/2/

答案 1 :(得分:0)

嗯,我真的不明白你想做什么。但有些意见:

$element.append("<input type='text' data-bind='style='" + value.inputStyle + "' />

不起作用。样式绑定接收具有样式和值的对象:

之类的东西
$element.append("<input type='text' data-bind='style:{color:#ff0000}' />");

所以你可以做到

$element.append("<input type='text' data-bind='style:{color:"+value.inputStyle.marginRight +"}'/>");

这假设marginR的颜色为字符串。

但为什么数据绑定呢?你可以这样做:

$element.append("<input type='text' style='color:"+value.inputStyle.marginRight +"'/>")