使用Data-Bind中的if condtion启用/禁用按钮?knockoutjs

sup*_*ool 3 html jquery knockout.js

我很擅长淘汰赛,需要一些帮助.我点击新按钮时会加载表单,当我点击列表页面中的用户名(dataTable)时,它也将从某个列表页面加载.

我需要的是看起来非常基本和直接.

场景1:当我来自NEW按钮时,我需要填写所有字段,然后我必须保存(按钮),它将处于启用状态,我也有禁用的NEXT STAGE BUTTON但是在成功保存时需要启用所以我可以进入下一阶段/页面.

场景2:这就是我在解决问题时遇到的麻烦.当我点击用户名链接来自某个列表页面时,数据将以表格形式自动填充,现在我必须使我的NEXT STAGE按钮在加载时预先启用,因为它已经是一个已保存的表单.

到目前为止我尝试了什么:

<button id="btnSave" class="btn" data-bind="click:$data.save">SAVE</button>
<input type ="button"  id="nextstage" data-bind="click:$root.nextstage,enable:false" value="NEXT STAGE"/>
Run Code Online (Sandbox Code Playgroud)

我也试图在数据绑定中使用IF条件,我完全不知道如何.

我的想法:在数据绑定中,我将基于我的表单上的字段启用/禁用NEXTSTAGE,例如如果我有这样的东西

<input type="text"  id="txtComepitors" data-bind="value:$data.Competitors"/>
Run Code Online (Sandbox Code Playgroud)

在我的页面加载如果文本框为空我将禁用,如果它不是我将启用.所以我只需要条件来启用/禁用data-bind中的nextstage.

这就是我所拥有的一切,并且认为它缺乏适当的实施.

Mat*_*and 8

很难从你的问题中准确地得到你所要求的内容,但最简洁的方法是使用一个computed可观察的方法.

所以在你的视图模型的某个地方,你会有这样的东西:

self.canSave = ko.computed(function() {
    // test conditions for saving here (i.e. whether all the fields have values)
    // and return true if you can save
    // for example:
    return self.someProperty() && self.someOtherProperty();
});
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样使用启用绑定:

<input type="button" value="Save Me!" data-bind="enable: canSave" />
Run Code Online (Sandbox Code Playgroud)

这是一个小提琴演示.注意保存按钮在两个文本框都有一些值之前是如何变灰的.

您可以根据需要使逻辑computed变得复杂,并且敲除将跟踪依赖关系,并在其中一个依赖的可观察对象发生更改时重新评估它.这可以防止VM逻辑混乱您的视图.

  • `if`条件也有它们的用途,但区别在于`If`条件,如果它的计算结果为false,实际上将删除其中的DOM元素.所以它不会禁用,它会完全消失.如果你的测试更复杂,只测试单个值的"真实性",你应该使用`computed`. (2认同)