我在<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 ..它不是很漂亮,但是它确实很重要。感谢大家的投入。
答案 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
});