在bootstrap模式中的ko.applyBindings之后,knockout绑定不适用于启用按钮

时间:2017-06-22 14:59:15

标签: checkbox knockout.js binding bootstrap-modal enable-if

我在检查复选框后尝试启用按钮,元素处于模态中。我正在使用MVC,并且我在主绑定之后添加了observable,以便将它们与这样的模态一起使用

<script type="text/javascript">
    var Model = function () {
        self.check = ko.observable(false);   
    };

    $(document).ready(function () {
        ko.cleanNode($('#Modal')[0]);
        ko.applyBindings(Model, $('#Modal')[0]);
    });

</script>

模态中的html元素如下所示:

<input type="checkbox" data-bind="checked:viewModel.check">bla bla..
<button type="button" data-bind="enable:viewModel.check==true" class="btn btn-primary">Delete</button>

当我选中复选框时,viewModel.check为true,未检查的时间为false,这是正常工作但按钮始终处于禁用状态。有任何建议请

1 个答案:

答案 0 :(得分:1)

有几个问题......

未实例化的ViewModel

调用ko.applyBindings时,第一个参数需要是viewModel 实例。这意味着您需要在viewModel“类”上调用new

ko.applyBindings(new Model())

HTML

中的范围不正确

您正在引用一个不存在的viewModel变量。应用绑定时,它使用传入的viewModel的范围来创建绑定上下文。这意味着HTML中可用的值与viewModel中this上的值相同。所以,只需使用check

enable绑定绑定到表达式,而不是可观察的

启用绑定必须绑定到observable,但您已将其绑定到表达式check==true。在这种情况下,check实际上是一个可观察的 - this.check = ko.observable(),因此您最终要比较的是function() { return true } == true的效果,预计false。要对可观察对象进行比较,必须先将它们作为函数调用来打开它们:check() == true。但请注意,无论何时编写== true,您可能都不需要:enable: check是您最终想要的。

and a fiddle