Javascript 取消对对象的自定义绑定

Javascript 取消对对象的自定义绑定,javascript,binding,knockout.js,Javascript,Binding,Knockout.js,我目前正在设计一个浏览器内计算器,我想要的功能是创建一个输入框,并将其绑定到视图模型中的对象 这个对象将有一个名为value的属性,它将是输入框显示的内容,但我也希望它有最小和最大限制,如果超过这些限制,将框的背景颜色更改为红色 我得到了基本的输入绑定,但是我在为输入绑定创建自己的自定义绑定包装器时遇到了问题,因为它也会改变背景颜色 我的HTML: <td><input data-bind="calcVar: resistance" type="text" size="16"

我目前正在设计一个浏览器内计算器,我想要的功能是创建一个输入框,并将其绑定到视图模型中的对象

这个对象将有一个名为value的属性,它将是输入框显示的内容,但我也希望它有最小和最大限制,如果超过这些限制,将框的背景颜色更改为红色

我得到了基本的输入绑定,但是我在为输入绑定创建自己的自定义绑定包装器时遇到了问题,因为它也会改变背景颜色

我的HTML:

<td><input data-bind="calcVar: resistance" type="text" size="16" /></td>
在视图模型中创建变量:

this.fSwAct = ko.observable(new calcVar(200, 100, 100, 0, 1000));
启动功能

// Start-up function
j(document).ready(
    function StartUp()
    {           
        // Create custom binding
        ko.bindingHandlers.calcVar = {
             init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
                  ko.bindingHandlers.value.init(element, valueAccessor()().value, allBindings, viewModel, bindingContext);
             },
             update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
                  // Call value binding (child binding)
                  ko.bindingHandlers.value.update(element, valueAccessor()().value, allBindings, viewModel, bindingContext);
             }
        };
        // Activates knockout.js
        var app = new AppViewModel();
        ko.applyBindings(app);  
    }
);

虽然正在调用自定义绑定函数,但输入绑定似乎不起作用,并且其他计算字段在值更改时不会更新。我觉得这与我创建calcVar“类”或将其传递到输入绑定的方式有关。

您实际上不需要自定义绑定来制作红色背景,您可以使用样式内置绑定。但定制绑定确实会产生更清晰的标记。下面是两个示例实现,一个带有自定义绑定,一个没有(fiddle:):

html:


谢谢,这确实有帮助!但我所追求的是在标记中使用一个绑定添加值和背景突出显示的能力,例如,
,这是因为我计划向输入框添加更多绑定功能,并且有很多绑定功能,这使得只进行一个绑定操作是值得的。
// Start-up function
j(document).ready(
    function StartUp()
    {           
        // Create custom binding
        ko.bindingHandlers.calcVar = {
             init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
                  ko.bindingHandlers.value.init(element, valueAccessor()().value, allBindings, viewModel, bindingContext);
             },
             update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
                  // Call value binding (child binding)
                  ko.bindingHandlers.value.update(element, valueAccessor()().value, allBindings, viewModel, bindingContext);
             }
        };
        // Activates knockout.js
        var app = new AppViewModel();
        ko.applyBindings(app);  
    }
);
<span>--------- no custom binding ---------</span><br />
<td><input data-bind="value:value, valueUpdate:'afterkeydown', style:{ 'background-color' : isOutsideBounds() ? 'red':'white'}" type="text" size="16" /></td>


<span>--------- with custom binding ---------</span><br />
<td><input data-bind="value:value, valueUpdate:'afterkeydown', calcVar: isOutsideBounds" type="text" size="16" /></td>
var CalcVar = function(value, lowerBound, upperBound) {
        var self = this;
        self.value = ko.observable(value);
        self.lowerBound = ko.observable(lowerBound);
        self.upperBound = ko.observable(upperBound);
        self.isOutsideBounds = ko.computed(function(){
            var val = parseFloat(self.value(),10);
            console.log(val);
            console.log(val > self.upperBound() || val < self.lowerBound());
        return val > self.upperBound() || val < self.lowerBound();
    }, self);

};

ko.bindingHandlers.calcVar = {
    init:function(element, valueAccessor){        
    },
    update:function(element, valueAccessor){        
        if(valueAccessor()()){
            $(element).css("backgroundColor", "red");
        } else {
            $(element).css("backgroundColor", "white");
        }
    }
}

ko.applyBindings(new CalcVar(100, 10,1000));
<span>--------- with custom binding tempalate ---------</span><br />
<div data-bind="template:{name:'superCalcTemplate', data:resistor1}" ></div>
<br />
<span>--------- with super custom binding ---------</span><br />
<div data-bind="superCalcVar:resistor1"></div>
<div data-bind="superCalcVar:resistor2"></div>

<script type="text/html" id="superCalcTemplate">
    <input data-bind="value:value, valueUpdate:'afterkeydown', calcVar: isOutsideBounds" type="text" size="16" />    
</script>
ko.bindingHandlers.calcVar = {
    init:function(element, valueAccessor, allBindings, viewModel, bindingContext){        
    },
    update:function(element, valueAccessor, allBindings, viewModel, bindingContext){        
        if(valueAccessor()()){
            $(element).css("backgroundColor", "red");
        } else {
            $(element).css("backgroundColor", "white");
        }
    }
}

ko.bindingHandlers.superCalcVar = {
    init:function(element, valueAccessor, allBindings, viewModel, bindingContext){   

        ko.renderTemplate("superCalcTemplate", valueAccessor(), {}, element, "replaceChildren");
         return { controlsDescendantBindings: true };              

    },
    update:function(element, valueAccessor, allBindings, viewModel, bindingContext){                               
    }
}