Javascript KnockoutJs中的条件数据绑定

Javascript KnockoutJs中的条件数据绑定,javascript,knockout.js,Javascript,Knockout.js,我在上有一个自定义绑定处理程序,我只想在用户具有Viewmodel的适当权限时应用它。此数据绑定允许用户拖放表中的元素以对列表重新排序 如果满足某些条件,是否可以有条件地绑定我的自定义绑定处理程序 基本上我想要: 这种行为可以通过击倒来实现吗?我认为我还可以采用其他策略,比如有一个按钮,允许用户对表进行排序(只有在他有正确的权限时才会显示),但我想检查是否还有其他方法 谢谢 编辑 我对我提出的解决方案感觉不好,但它让我得到了我想要的结果: @Html.Partial(“\u FilesT

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

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

基本上我想要:


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

谢谢

编辑

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


@Html.Partial(“\u FilesTabTableBody”)
@Html.Partial(“\u FilesTabTableBody”)
基本上,我只是在两个地方复制HTML。这并不漂亮,但它确实完成了这项工作。感谢大家的投入。

使用计算的

<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
});

vm.safeList=ko.computed(函数(){
如果(vm.hasPermission)返回vm.list;
返回undefined;//或在用户没有权限时执行的任何操作
});
使用计算的

<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
});

vm.safeList=ko.computed(函数(){
如果(vm.hasPermission)返回vm.list;
返回undefined;//或在用户没有权限时执行的任何操作
});

您可以使用虚拟元素


您可以使用虚拟元素


自定义绑定的好处在于您拥有完全的控制权。在自定义绑定中,可以添加另一个参数来控制绑定的行为。例如,您可以创建一个可见绑定,该绑定仅在另一个可观察对象为true时才被使用:

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

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

ko.applyBindings(new vm());
HTML:


这是一个完整的演示。“显示消息”复选框的设置仅在选中“可以更改可见”时使用。

自定义绑定的好处是您可以完全控制。在自定义绑定中,可以添加另一个参数来控制绑定的行为。例如,您可以创建一个可见绑定,该绑定仅在另一个可观察对象为true时才被使用:

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

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

ko.applyBindings(new vm());
HTML:



这是一个完整的演示。“显示消息”复选框的设置仅在选中“可以更改可见”时使用。

感谢您帮助我入门。自定义绑定使用jquery UI使表中的行可以拖放。我在该节点上还有一个foreach绑定来枚举所有行。如果我的自定义绑定处理程序应用于未定义的,我相信它仍然允许用户拖放行。在这种情况下,您可以为foreach绑定进行另一次计算,当用户没有权限时,该绑定将返回空数组(或任何内容)。感谢您帮助我开始。自定义绑定使用jquery UI使表中的行可以拖放。我在该节点上还有一个foreach绑定来枚举所有行。如果我的自定义绑定处理程序应用于未定义的,我相信它仍然允许用户拖放行。在这种情况下,您可以为foreach绑定进行另一次计算,当用户没有权限时,该绑定将返回空数组(或任何内容)。谢谢您的回复。不管怎样,我都想保留这个节点,只是在某些情况下我不希望它有那种自定义绑定。tbody还有一个数据绑定:foreach来枚举列表中的所有行。如果您的视图模型不包含任何项目,如果用户没有查看这些项目的权限,那么它将是最干净的。因此,无论如何,在视图中这样做是错误的。计算结果可能会起作用,但实际上您的API甚至不应该返回这些项。混淆用户一开始不应该看到的东西不是一个好的策略。对不起,我想我们可能缺少沟通。我想让用户看到这个列表中的元素,我只是不希望他们能够重新排序,除非他们有权限。这就是情景。啊,好吧。在这种情况下,我可能会使用自定义绑定
sortable:hasPermission
。对于没有权限的用户,您有什么替代方法,您仍然使用相同的
列表吗?您能否将@Tomalak的答案与
..
结合起来?谢谢您的回复。不管怎样,我都想保留这个节点,只是在某些情况下我不希望它有那种自定义绑定。tbody还有一个数据绑定:foreach来枚举列表中的所有行。如果您的视图模型不包含任何项目,如果用户没有查看这些项目的权限,那么它将是最干净的。因此,无论如何,在视图中这样做是错误的。计算结果可能会起作用,但实际上您的API甚至不应该返回这些项。混淆用户一开始不应该看到的东西不是一个好的策略。对不起,我想我们可能缺少沟通。我想让用户看到这个列表中的元素,我只是不希望他们能够重新排序,除非他们有权限。这就是情景。啊,好吧。在这种情况下,我可能会使用自定义绑定
sortable:hasPermission
。对于没有权限的用户,您有什么替代方法,您仍然使用相同的
列表吗?你能把@Tomalak的答案和
结合起来吗?我只是想知道,在你编辑之后,你知道服务器端的用户是否有权限吗?因为这样你就可以呈现适当的html服务器端了,这是一个很好的直觉。当用户与列表交互时,hasPermission实际上会改变,所以我不能使用模板化HTML来完成所有操作。好主意!我只是想知道,在您进行编辑之后,您是否知道服务器端的用户
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);
    }
};