javascript - 订阅 KnockoutJS 中现有 DOM 元素的绑定(bind)

标签 javascript knockout.js data-binding

我需要订阅 DOM 元素的现有绑定(bind)。作为示例,我有以下输入元素:

<div id="MyDiv">
    <input id="MyInput" data-bind="enable: isEnabled()" />
</div>

现在,假设我只能访问 DOM 元素,我需要执行如下操作:

var inputElement = $("#MyInput");
var bindings = ko.utils.getBindings(inputElement); // getBindings does not exist
var enableBinding = bindings["enable"];
if (enableBinding != undefined) {
    enableBinding.subscribe(function (value) {
        if (value == false)
            $("#MyDiv").addClass("disabled");
        else
            $("#MyDiv").removeClass("disabled");
    })
}

有办法做到这一点吗?

更新:我已经扩展了示例,以便您可以看到我的用例:此处的 div 由预处理器自动生成,需要 当输入被禁用时,它的disabled类。如果仅在输入元素上更改属性,则它不起作用。添加/删除必须透明......

最佳答案

简短回答:不要这样做。 getBindings 在 Knockout 工具包中不是一个特别明显的函数是有原因的。

长答案:您可以通过一些间接方式获得原始绑定(bind)。

HTML:

<div id="MyDiv">
    <input id="MyInput" data-bind="enable: isEnabled" />
</div>

<input type="checkbox" data-bind="checked: isEnabled" />

JS:

var viewModel = function() {
    self.isEnabled = ko.observable(true);           
}

ko.applyBindings(new viewModel());

var input = $('#MyInput')[0];

function getBinding(element, name) {
    var bindings = ko.bindingProvider.instance.getBindings(input, ko.contextFor(input));

    return bindings.hasOwnProperty(name) ? bindings[name] : null;
}

var binding = getBinding(input, 'enable');

binding.subscribe(function(value) {
    if (value == false)
        $("#MyDiv").addClass("disabled");
    else
        $("#MyDiv").removeClass("disabled");
});

Working JSFiddle

编辑:找到了更短的方法

同样,如果有任何方法可以说服预处理器添加 CSS observable,请这样做。以这种方式处理绑定(bind)依赖于 Knockout 3.3.0 内部实现的特定怪癖,这些怪癖可能会在未来的版本中发生变化。

关于javascript - 订阅 KnockoutJS 中现有 DOM 元素的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29900270/

相关文章:

javascript - 在后台任务中保存数据的推荐方法是什么? [UWP/W/WP 应用]

javascript - 执行脚本调用后,CSS 无法正确呈现属性

javascript - 为什么这里需要$root?

javascript - 使用 javascript/knockout 设置父级父级 css

javascript - VueJS 中的数据绑定(bind)以构建 URL

JavaScript 'click' 不工作

javascript - 找不到 Vue.js $ref

asp.net-mvc - knockout.js viewmodel 未绑定(bind)在 asp.net mvc Controller 中进行发布

c# - 在不更改所选项目的情况下聚焦 wpf 列表框

asp.net - 根据 Entity Framework 导航属性中的项目计数对绑定(bind)的 ASP.NET GridView 进行排序