Knockout.js 有条件的';单击';敲除结合

Knockout.js 有条件的';单击';敲除结合,knockout.js,Knockout.js,我正在将单击事件绑定到列表中的每个列表项: <ul class="modal-subject-list" data-bind="foreach: filteredSubjects"> <li data-bind="click: $parent.pickSubject, css: {alreadyAddedBackground: hasBeenAdded}"> <!-- Lots of code

我正在将单击事件绑定到列表中的每个列表项:

        <ul class="modal-subject-list" data-bind="foreach: filteredSubjects">
            <li data-bind="click: $parent.pickSubject, css: {alreadyAddedBackground: hasBeenAdded}">
                <!-- Lots of code here -->
            </li>
        </ul>
如果'hasBeenAdded'解析为true,我想禁用
单击:
绑定。我知道一些处理它的方法:

  • 有两个列表项,一个用于添加
    if:hasbeended
    ,另一个用于
    if:!已添加
    。这远不是干的
  • 用javascript处理这个检查,而不使用视图-我不喜欢这样,因为正在为本质上应该禁用的列表项生成不必要的标记
  • 有没有办法注册“clickIf”绑定?

    这样做

        <ul class="modal-subject-list" data-bind="foreach: filteredSubjects">
            <li data-bind="click: hasBeenAdded ? null : $parent.pickSubject">
                <!-- Lots of code here -->
            </li>
        </ul>
    

    读-


    如果已添加filteredSubject,请不要执行任何操作,否则请添加到列表或其他任何操作。

    只想扩展@PW Kad的答案,以防它对其他人有帮助。

    我发现我可以对knockout事件节点应用一个条件,以便绑定所有或任何处理程序。在我的例子中,我只需要将事件绑定到非只读的输入。所以,如果你需要做类似的事情,这是可行的。快乐编码

    事件:$data.SomeProperty()?null:{多个事件处理程序}

    示例代码:

    <input type="number"
           data-bind="value: $data.Value,
                      css: $data.Css,
                      attr: {
                          title: $data.Title,
                          min: $data.Min,
                          max: $data.Max,
                          readonly: $data.ReadOnly
                      },
                      event: $data.ReadOnly() ? null : {  // <----- HERE
                          focus: $root.onFocus,
                          blur: $root.onBlur,
                          input: $root.onInput,
                          keypress: $root.onKeypress
                       }" />
    
    
    
    单击时不执行任何操作的按钮很难对用户友好,最好只使用enable/disble bindingOP,因为他希望有条件地处理单击绑定,无论他在生产环境中是否使用null都是他的选择……最好用函数替换“null”
  • @Kishor,你能解释一下为什么它更好吗?小心,使用返回false的函数有完全不同的含义。如果存在
    null
    ,则敲除不会将任何内容绑定到事件。例如,当您传递这种函数时,默认事件至少会被阻止。