Post 如何启用/禁用select标记并使用敲除将其张贴(即使已禁用)

Post 如何启用/禁用select标记并使用敲除将其张贴(即使已禁用),post,knockout.js,html-select,disabled-input,Post,Knockout.js,Html Select,Disabled Input,我有一个复杂的表单,有许多选择,其启用/禁用状态取决于一些其他控件的值,因此在提交表单时这些选择可能被禁用,并且选择值未发布。即使不允许用户更改选择,我也需要发布所选值 我在这里看到了一些解决方案,主要是让一个隐藏字段与禁用的select同步 我想采用一种稍微不同的方法:我想使用项目中已经使用的knockout,仅在数据可编辑时显示select,否则显示只读输入或div/span 如何使用knockout简化此方法?在我的viewModel中,我定义了与select状态相关的属性、绑定到sele

我有一个复杂的表单,有许多选择,其启用/禁用状态取决于一些其他控件的值,因此在提交表单时这些选择可能被禁用,并且选择值未发布。即使不允许用户更改选择,我也需要发布所选值

我在这里看到了一些解决方案,主要是让一个隐藏字段与禁用的select同步

我想采用一种稍微不同的方法:我想使用项目中已经使用的knockout,仅在数据可编辑时显示select,否则显示只读输入或div/span


如何使用knockout简化此方法?

在我的viewModel中,我定义了与select状态相关的属性、绑定到select值的属性以及读取select中所选选项描述的计算可观测值:

AppViewModel: function () {
        var self = this;
        self.SelectVisible = ko.computed(function () {
            return true;  // return true or false depending on your context
        }, self);
        self.Category = ko.observable("");
        self.CategoryText = ko.computed(function () {
            return $("#Category option[value='" + self.Category() + "']").text();
        }, self);
        // other code ...
}
在页面中,我有一个“选择始终启用”和一个只读输入,其可见性是相互隔离的,并且取决于viewModel属性:

<select name="Category" id="Category" data-bind="value: Category, visible: SelectVisible">
   <option value="S">Standard</option>
   <option value="N">CatN</option>
   <option value="C">CatC</option>
</select>
<input style="display: none;" type="text" readonly="readonly" data-bind="value: CategoryText, visible: !SelectVisible()"/>

简单地禁用select就足以阻止它发布-您不必将其设置为只读。这其实很直截了当。使用attr绑定,可以有条件地应用属性。因此,您所需要的只是一个可观察对象,它为select保存一个布尔状态:

AppViewModel: function () {
        var self = this;
        self.SelectVisible = ko.computed(function () {
            return true;  // return true or false depending on your context
        }, self);
        self.Category = ko.observable("");
        self.CategoryText = ko.computed(function () {
            return $("#Category option[value='" + self.Category() + "']").text();
        }, self);
        // other code ...
}
在您的视图模型中

您的选择绑定

然后,当您希望禁用任何这样的选择绑定时,只需将observable设置为true:

viewModel.DisableSelects(true)
显然,如果您想要更大的粒度,只需创建更多这样的可观察对象并进行适当绑定

编辑


你的问题并没有明确说明你真正想要什么,但我觉得问题是你确实想要发布这个值,即使它被禁用了。在这一点上,我必须同意第一个相关问题的答案:根本不要依赖于发布的价值。将字段设置为只读或禁用不会阻止更改值。每个现代浏览器都内置了开发工具,让您可以在适当的位置更改HTML,即删除readonly或disabled标志,任何对HTML有基本了解的人都可以做到这一点。如果您想要一个只读字段,那么实现这一点的唯一安全方法是完全忽略已发布的值。您可以对隐藏的输入等进行各种操作,但也可以很容易地进行操作。

您可以将knockout view model变量IsDisable绑定到选择列表


是的,我确实希望发布该值,即使该值已禁用。很抱歉,我没有那么明确,我将编辑这个问题。我不担心安全问题,因为我的应用程序是一个以数据为中心的intranet应用程序,但我将更加关注您关注的问题。非常感谢。好吧,即使安全性可能不是一个问题,但最好将任何应用程序视为可能受到危害,如果没有其他原因,除非你不再为一个应用程序担心,否则你可能不记得为下一个重要的应用程序担心。
viewModel.DisableSelects(true)