条件数据绑定在KnockoutJs中

时间:2014-04-23 15:48:22

标签: javascript knockout.js

我在<tbody>上有一个自定义绑定处理程序,如果用户具有Viewmodel的适当权限,我只想应用它。此数据绑定允许用户拖放表中的元素以重新排序列表。

如果满足某些条件,是否可以有条件地数据绑定我的自定义绑定处理程序?

基本上我想:     

<tbody data-bind="if (hasPermission){custom-binding: list}"></tbody>

这种行为是否可以通过淘汰赛实施?我认为我可以采用其他策略,比如有一个允许用户对表进行排序的按钮(只有在他有正确的权限时才显示),但我想检查是否有其他方法。

感谢。

修改

我对我提出的解决方案感觉不是很好,但它让我得到了我想要的结果:

        <!--ko if: hasPermission-->
        <tbody data-bind="foreach: list, sortableList: list">
            @Html.Partial("_FilesTabTableBody")
        </tbody>
        <!-- /ko -->
        <!--ko if: !hasPermission()-->
        <tbody data-bind="foreach: list">
            @Html.Partial("_FilesTabTableBody")
        </tbody>
        <!-- /ko -->

基本上我只是在两个地方重复HTML ..它不是很漂亮,但是它确实很重要。感谢大家的投入。

3 个答案:

答案 0 :(得分:2)

您可以使用虚拟元素。

<!-- ko if: hasPermission -->
<tbody data-bind="custom-binding: list"></tbody>
<!-- /ko -->

答案 1 :(得分:2)

自定义绑定的好处在于您拥有完全控制权。在自定义绑定中,您可以添加另一个控制绑定行为方式的参数。例如,您可以创建一个仅在另一个observable为真时才会被尊重的可见绑定:

var vm = function() {
    var me = this;

    me.canChangeVisible = ko.observable(true);
    me.showMessage = ko.observable(true);
}

ko.applyBindings(new vm());

HTML:

<div>
    <div><input type="checkbox" data-bind="checked: canChangeVisible">Can Change Visible</input></div>
    <div><input type="checkbox" data-bind="checked: showMessage">Show Message</input></div>
</div>
<div data-bind="makeVisible: showMessage, basedOn: canChangeVisible">Message</div>

在自定义绑定中,查看“basedOn”以查看是否应该使用它:

ko.bindingHandlers.makeVisible = {
    update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
        var bo = allBindings.get('basedOn');
        var canChange = bo == null ? true : ko.unwrap(bo);
        if( canChange )
            ko.bindingHandlers.visible.update(element, valueAccessor, allBindings, viewModel, bindingContext);
    }
};

这是一个完整的jsFiddle,显示了这一点。只有在选中“可以更改可见”时才会使用“显示消息”复选框的设置。

答案 2 :(得分:1)

使用计算..?

<tbody data-bind="custom-binding: safeList"></tbody>

vm.safeList = ko.computed(function() {
    if (vm.hasPermission) return vm.list;
    return undefined; // or whatever you do when user has no permission
});