【问题标题】:knockout.js with optionsValue and value带有 optionsValue 和 value 的 knockout.js
【发布时间】:2013-06-24 21:56:15
【问题描述】:

有没有办法让value 绑定到对象,但让optionsValue 成为对象的属性。到目前为止,如果我同时指定两者,则选择的 optionsValue 属性将填充 value 绑定。我想在 observable 中保持对象完整,但指定要在选择列表值中设置的值。这样,表单提交将发送我选择的optionsValue

@Html.DropDownListFor(q => q.DivisionId, new SelectList(Enumerable.Empty<string>()), new { data_bind="options: divisions, optionsText: 'Name', optionsValue: 'Id', value: division, optionsCaption: ' - '" })

function AddCrossPoolGameDialog() {
    var self = this;

    self.divisions = ko.observableArray([]);
    self.division = ko.observable();

    self.awayDivisionTeams = ko.computed(function () {
        var division = ko.utils.arrayFirst(self.divisions(), function(item) {
            return self.division.Name() == item.Name;
        });

        if (division) {
            return division.DivisionTeamPools;
        }

        return [];
    });
}

【问题讨论】:

  • 为这种行为编写绑定听起来很简单。我不知道内置的方式。另一种方法是简单地为值和提交使用两个不同的属性。另一个问题,如果属性没有真正观察到改变,为什么它是一个可观察的属性?
  • 其他一些下拉菜单依赖于它来显示/隐藏。
  • 我真的无法理解您的结构,您介意在 jsfiddle 上创建一个非常简化的问题示例并在此处发布代码吗?
  • 据我所知,JsFiddle 不允许使用 Razor 语法。你能不能设置一个 @HiddenFor() 或 @TextBoxFor() 等于 DivisonId 并将它的值设置为类似于 selectedDivisionId() 的值?
  • 只需复制 Razor 的 output 的 HTML/JS/CSS(reduced 示例!)(您的 asp.net 应用程序是 服务

标签: knockout.js


【解决方案1】:

您不能同时让optionsValuevalue 绑定指向不同的对象,但您可以创建一个简单的解决方法。

为了让您的表单提交一个简单的值,请使用optionsValue 指向您希望与表单一起发布的绑定项目的属性。然后将value 绑定分配给可观察对象。最后,创建一个computed,以便在选择的值发生变化时自动查找并返回正确的对象。

示例绑定:

<select data-bind="options: options,
                   optionsText: 'name',
                   optionsValue: 'id',
                   value: selectedOptionId"></select>
<br/>
<br/>
Selection Option Object : <span data-bind="text: selectedOption"></span><br/>
Selection Option name : <span data-bind="text: selectedOption().name"></span><br/>
Selection Option id : <span data-bind="text: selectedOption().id"></span><br/>

和视图模型:

var optionModel = function(id,name){
    var self = this;
    self.id = id;
    self.name = name;
}

var viewModel = function(){
    var self = this;
    self.options = [
        new optionModel(1,"First"),
        new optionModel(2,"Second")
    ];
    self.selectedOptionId = ko.observable(self.options[0].id);
    self.selectedOption = ko.computed(function(){
        return ko.utils.arrayFirst(self.options, function(item){
            return item.id === self.selectedOptionId();
        });
    });
}

ko.applyBindings(new viewModel());

I've posted this to a jsFiddle here.

希望这会有所帮助!

【讨论】:

  • 这是多么棒的 p.i.t.a 才能让它用于全局表单验证,谢谢!
  • 维护 KO 代码是一场噩梦,为什么过去我没有使用其他任何东西 - 哦等等,Po(S)C 需要在 IE8 中运行...
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 2014-03-15
  • 2012-06-30
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
相关资源
最近更新 更多