【问题标题】:MVC knockout Cascading dropdown from arrays阵列中的 MVC 淘汰赛级联下拉菜单
【发布时间】:2014-09-26 06:32:53
【问题描述】:

Knockout 新手,将我的 MVC 应用程序从使用 Telerik MVC 组合框迁移到 Knockout。 我使用 Ajax 生成两个数组,并使用以下命令将它们绑定到 Knockout select:

<select data-bind='options: myFirstList, optionsText: "Text", optionsCaption: "Select...", value: 0'> </select>
<select data-bind='options: mySecondList, optionsText: "Text", optionsCaption: "Select...", value: 0'> </select>



  function myViewModel() {
        this.myFirstList = ko.observableArray([]);
        this.mySecondList = ko.observableArray([]);

       }
    var objVM = new myViewModel();
    ko.applyBindings(objVM);

Using Ajax:
  $.ajax({
            url: '/Home/CheckWord',
            type: 'POST',
            data: {
                cword: wordtocheck
            },
            success: function (data) {
              .....

                }
                objVM.mySecondList(stateList[0]);

                var fnArray = [];

                for (var k = 0; k < data.fnList.length; ++k) {
                    fnArray[k] = { Text: data.fnList[k], Value: k };
            }

                objVM.myFirstList(fnArray);
            },
            error: function () {
                alert("n");
            }
        });

无法弄清楚如何根据从第一个列表中选择的项目更改第二个选择列表,以及如何使用从第二个列表中选择的项目触发 Javascript 操作。 如果有人能给我举个例子,将不胜感激。

【问题讨论】:

    标签: javascript ajax asp.net-mvc knockout.js


    【解决方案1】:

    在 HTML 中,将 'value' 绑定到 observable

    <select data-bind='options: myFirstList, optionsText: "Text",
      optionsCaption: "Select...", value: myFirstListSelected'> </select>
    <select data-bind='options: mySecondList, optionsText: "Text",
      optionsCaption: "Select...", value: mySecondListSelected'> </select>
    

    在 JS 中,使用 subscribe 来监听模型的变化事件

    function myViewModel() {
      var self = this;
      self.myFirstList = ko.observableArray([]);
      self.mySecondList = ko.observableArray([]);
      self.myFirstListSelected = ko.observable();
      self.mySecondListSelected = ko.observable();
      // when first selected changes
      self.myFirstListSelected.subscribe(function(newVal) {
        // ignore blank selection
        // or you can clear second list when user deselects first one.
        // if (newVal == null) {
        //   self.mySecondListSelected(undefined);
        //   self.mySecondList.removeAll();
        //   return;
        //  }
        if (newVal == null) return;
        $.ajax({
          //...
          data: { cword: newVal },
          success: function (data) {
            //...
            // clear selected
            self.mySecondListSelected(undefined);
            // reload second list
            self.mySecondList(stateList[0]);
            //...
          }
          //...
        });
      });
      // when second selected changes
      self.mySecondListSelected.subscribe(function(newVal) {
        //... beware newVal could be null or undefined when user deselects it.
      });
    }
    

    【讨论】:

    • 谢谢,有没有办法将所选项目的 myFirstList 中的值,例如第二个项目的 2 传递给 mySecondList objVM.mySecondList(stateList[2]),以更新它。我无法使用 newVal 进行 Ajax。另外如何从第二个列表中获取所选项目的值。
    • 抱歉,没有检查您的代码。 objVM 不可见,在回调中使用self。更新了答案。
    • 在回调内部,newVal 是当前值。如果你想访问其他地方的值,只需调用self.myFirstListSelected()
    • 我想我误解了你。您的 myFirstList 包含 [1,2,3...],而不是传递给 ajax 调用的单词,对吗?如果是这种情况,修改ajax中的代码,data: {cword: wordtocheck}self.mySecondList(stateList[newVal]);
    • 如果上述情况属实,那么只需要触发一次ajax,将所有结果保存在某个地方,然后使用self.myFirstListSelected.subscribe(function(newVal) { self.mySecondListSelected(undefined); self.mySecondList(savedStateList[myVal]);});
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2017-04-09
    • 2015-05-06
    • 2016-11-23
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多