javascript - 可以在 Knockout 中创建自定义 if 绑定(bind)

标签 javascript knockout.js

我想创建一个“fadeInIf”自定义绑定(bind)。我的想法等于来自: http://knockoutjs.com/examples/animatedTransitions.html 的“fadeVisible” :

// Here's a custom Knockout binding that makes elements shown/hidden via jQuery's fadeIn()/fadeOut() methods
// Could be stored in a separate utility library
ko.bindingHandlers.fadeVisible = {
    init: function(element, valueAccessor) {
        // Initially set the element to be instantly visible/hidden depending on the value
        var value = valueAccessor();
        $(element).toggle(ko.utils.unwrapObservable(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
    },
    update: function(element, valueAccessor) {
        // Whenever the value subsequently changes, slowly fade the element in or out
        var value = valueAccessor();
        ko.utils.unwrapObservable(value) ? $(element).fadeIn() : $(element).fadeOut();
    }
};

我对自定义绑定(bind)还很陌生,但认为它可能是这样的:

ko.bindingHandlers.fadeInIf = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = valueAccessor();
        $(element).toggle(ko.utils.unwrapObservable(value));

        ko.bindingHandlers.if.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = valueAccessor();
        if (ko.utils.unwrapObservable(value))
            $(element).fadeIn();

        ko.bindingHandlers.if.update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
    }
};

我已经有了“fadeVisible”功能,但无法解决这个问题,我错过了什么?

最佳答案

谢谢你的建议。 我终于让它工作了,我错过了 controlsDescendantBindings选项。结果如下:

ko.bindingHandlers.fadeIf = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

        var value = valueAccessor();
        $(element).toggle(ko.utils.unwrapObservable(value));

        ko.bindingHandlers['if'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
        return { controlsDescendantBindings: value };
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var value = valueAccessor();
        if (ko.utils.unwrapObservable(value)) {
            ko.bindingHandlers['if'].update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
            $(element).fadeIn();
        }
        else {
            $(element).fadeOut(200, function () {
                ko.bindingHandlers['if'].update(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
            });
        }
    }
};

关于javascript - 可以在 Knockout 中创建自定义 if 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16483267/

相关文章:

javascript - 如何捕获哪个事件隐藏了我的日期选择器?

jquery - 将项目添加到 observableArray 不更新 jQuery 按钮单击上的 View

javascript - 从服务器过滤数据(使用 knockout )

javascript - 按钮的背景颜色不会通过 Tab 键选择而改变

javascript - 鼠标滚轮快速平滑滚动

javascript - 为什么俄罗斯方 block 会同时掉落而不是一次掉落一个?

javascript - 验证触发其他内容的下拉输入

javascript - 如何在 Angular 单元测试中模拟/监视导入的函数

javascript - 更正与表格相关的鼠标移开和鼠标悬停

javascript - knockoutjs kogrid 在单元格内显示日期 - 带 plunk