【问题标题】:Knockout adding options to select list淘汰赛添加选项以选择列表
【发布时间】:2017-06-09 03:57:21
【问题描述】:

我正在努力弄清楚如何正确地将更多选项动态地添加到选择列表中。

此代码有效,但它会清除数组中存在的所有内容,因为它是设置数组的值而不是推送:

// add seller to dropdown list
var opts = [];
opts.push({Text: studentName, Value: result.sellerID});
console.log("opts: " + JSON.stringify(opts));
if (sellerOptionModel.sellers.indexOf(opts) < 0) {
  sellerOptionModel.sellers(opts);
}

而且这段代码不起作用,它只是在下拉选择列表中添加了一个空白项:

// add seller to dropdown list
var opts = [];
opts.push({Text: studentName, Value: result.sellerID});
console.log("opts: " + JSON.stringify(opts));
if (sellerOptionModel.sellers.indexOf(opts) < 0) {
  sellerOptionModel.sellers.push(opts);
}

视图模型:

var SellerOptionModel = function() {
  var self = this;
  self.sellers = ko.observableArray([]);
  self.sellerID = ko.observable();
}

成功部分包含以上 KO 代码的完整 JS 函数:

$("#nextForm").on('click', function(e) {
  e.preventDefault();
  var room = $("#roomSelect").val();
  var invalidItems = invalidItemsArr.join(",");
  $("#invalidItems").val(invalidItems);
  if(verify == "True") {
    var seller = $('#sellerSelect').val();
  }
  if(room == "") {
    e.preventDefault();
    slideDownMsg("Please select a room first.");
    slideUpMsg(4000);
  } else {
    var firstName = capitalizeFirstLetter($.trim($("#firstName").val()));
    var lastName = capitalizeFirstLetter($.trim($("#lastName").val()));
    if(verify != "True" && (firstName == "" || lastName == "")) {
      e.preventDefault();
      slideDownMsg("Please fill in the student's first and last name.");
      slideUpMsg(3500);
    } else if(seller == "") {
      e.preventDefault();
      slideDownMsg("Please select a seller from the dropdown.");
      slideUpMsg(3500);
    } else { // all good we can save the student
      $.ajax({
        url: '@Url.Action("SaveStudent", "Tally")',
        type: 'POST',
        data: $("#tallyForm").serialize(),
        success: function (result) {
          if(result.success == true) {
            var studentName = firstName + " " + lastName;
            slideDownMsg("Tally entry saved for " + studentName + ".");
            slideUpMsg(4000);
            var room = $("#roomSelect").val();
            $("#tallyForm")[0].reset();
            $("#roomSelect").val(room);
            tallyViewModel.items([]);
            tallyViewModel.addLine();
            if(room != "") {
              getImage(room);
            }
            tallyViewModel.runningQty(0);
            tallyViewModel.runningTotal(0);

            // add seller to dropdown list
            var opts = [];
            opts.push({Text: studentName, Value: result.sellerID});
            console.log("opts: " + JSON.stringify(opts));
            if (sellerOptionModel.sellers.indexOf(opts) < 0) {
              sellerOptionModel.sellers.push({Text: studentName, Value: result.sellerID})
            }
            sellerOptionModel.sellers.sort();
          } else {
            slideDownMsg("Failed saving tally entry for " + firstName + " " + lastName + ".");
            slideUpMsg(4000);
          }
        },
        error: function (request, status, error) {
          e.preventDefault();
          displayError("Error", request.responseText);
        }
      });
    }
  }
});

【问题讨论】:

  • 您正在将opts 数组添加到您的sellers 数组(数组中的数组)。你可能想要sellerOptionModel.sellers.push({Text: studentName, Value: result.sellerID})。但是您的 indexOf 将始终为 -1,因为它通过引用比较对象。
  • 哦,那我怎么才能只在项目不存在的情况下添加呢?
  • "indexOf(opts)" 永远不会起作用,因为 opts 是您刚刚创建的新数组。没有任何情况下它已经存在于数组中。如果您显示更多代码,我可以举一个例子
  • 那太好了。我在页面上有很多代码,但我认为其余的与此无关。你还需要看什么?
  • 基本上,每次我单击一个按钮时,都会调用该代码将当前卖家添加到数组中(下拉菜单)。而且我只想要下拉列表中的独特卖家。

标签: knockout.js


【解决方案1】:

在淘汰赛中将项目动态添加到选择列表应该与将项目添加到选择列表绑定到的可观察数组一样简单。诀窍不是替换现有数组的内容。

您应该直接将项目推送到原始可观察数组中,而不是创建一个新数组并将可观察数组设置为它。

sellerOptionModel.sellers.push({Text: studentName, Value: result.sellerID});

仅在项目不存在时才添加项目的问题归结为您如何定义项目是否为相同项目。通常,“对象”仅在完全相同的对象引用时才等效,并且具有相同内部值的类似对象不计在内。例如:

var a = { id: 3 };
var b = { id: 3 };
console.log(a == b); //returns false;

您真正想要用来比较选项对象的可能是您为它们提供的 Value 属性。 indexOf 不会帮到你,所以你需要手动遍历项目,并根据新项目的值检查每个项目的 Value 属性。

var match = false;
for (var i = 0; i < sellerOptionModel.sellers().length; i++) {
    if(sellerOptionModel.sellers()[i].Value == result.sellerID){
        match = true;
        break;
    }
}
if (!match) {
    console.log("new id added");
    sellerOptionModel.sellers.push({Text: studentName, Value: result.sellerID});
    sellerOptionModel.sellers.sort();
}else{
    console.log("id already exists")
}

工作示例:https://jsfiddle.net/jlspake/8c3tvn9u/

【讨论】:

  • 太棒了!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2013-10-18
  • 1970-01-01
  • 2013-07-15
  • 2017-12-07
相关资源
最近更新 更多