【问题标题】:How to select quantity of individual cartItems in KnockoutJS如何在 KnockoutJS 中选择单个 cartItems 的数量
【发布时间】:2016-03-25 04:57:09
【问题描述】:

您好,我是个新手,我试图让我的数组 cartItems 从下拉列表中自动选择它们的数量。这是我的代码:

查看

<div data-bind="foreach: cartItems">
   <h3 data-bind="text: fullname"></h3>
   <p data-bind="text: sku"></p>
   <select data-bind="quantityDropdown: number"></select>
</div>

视图模型

var number = 50;
ko.bindingHandlers.quantityDropdown = {
    update: function (element) {
        for (var i = 1; i < number + 1; i++) {
            var selectedQty = "";

            for (var x = 0; x < self.cartItems().length; x++) {
                var itemqty = parseFloat(self.cartItems()[x].qty, 10);

                if (i === itemqty) {
                    selectedQty = " selected='selected'";
                }
            }
            // Add each option element to the select here
            $(element).append("<option value='" + i + "' " + selectedQty + " class='quantity'>" + i + "</option>");
        }
    }
};

现在我将两件商品放入购物车,然后出现下拉菜单。但是购物车中的两个项目的“选定”编号是相同的吗?我知道它是因为它不是特定于项目的。但我不确定如何在 Knockoutjs 中使其成为特定项目。

【问题讨论】:

  • 为什么不使用options 绑定处理程序?此外,您不会使用您传递给 quantityDrowndown 处理程序的 number 参数...

标签: javascript jquery knockout.js


【解决方案1】:


工作示例: http://jsfiddle.net/GSvnh/5085/


查看:

 <div data-bind="foreach: CartItems">
     <h3 data-bind="text: FullName"></h3>
      <p data-bind="text: Sku"></p>
      <select name="qty" class="form-control" data-bind="foreach: QuantityDropdown ,value:SelectedQuantity">
    <option data-bind="value: Value,text:Name"></option>
  </select>
</div>

虚拟机:

  $(function () {
    var MainViewModel = function () {
    var self = this;
    self.CartItems = ko.observableArray([]);
    //For example you get below array of objects as response
    var response = [{ fullname: "ABC", sku: "1234567789", qty: 12 },
                    { fullname: "AAA", sku: "2323227789", qty: 20 },
                    { fullname: "BBB", sku: "2311227789", qty: 33 }
    ];

    //you map your response and for each item you create a new CartItemViewModel   
    self.CartItems($.map(response, function (item) {
      return new CartItemViewModel(item);
    }));

    }

    var CartItemViewModel = function (data) {
     var self = this;
     var number = 50;
     self.FullName = ko.observable(data.fullname);
     self.Sku = ko.observable(data.sku);
     self.QuantityDropdown = ko.observableArray();

     for (var i = 1; i < number + 1; i++) {
       self.QuantityDropdown.push({ Value: i, Name: i });
     }
     self.SelectedQuantity = ko.observable(parseFloat(data.qty, 10));
     self.SelectedQuantity.subscribe(function (newValue) {
        alert("selected Qty : "+  newValue);
     })
   }
   ko.applyBindings(new MainViewModel());

  })

【讨论】:

  • 你好。是的,它一直给我数据未定义? self.SelectedQuantity = ko.observable(parseFloat(data.qty, 10));有什么想法可以在那里填充行数量吗?
  • 我的购物车商品格式如下:self.cartItems = ko.observableArray(arrayFromJson);
  • 是的,我使用以下方法从 cookie 中获取我的数组:var cookiestring = $.cookie("cookieCart"); var arrayFromJson = JSON.parse(cookiestring);然后数组打印为 [Object fullname: "Item1" qty: 3 sku: "ACS1" Object fullname: "Item2" qty: 1 sku: "ACS2"]
  • 我在视图模型中调用它:function AppViewModel() { var self = this; self.cartItems = ko.observableArray(arrayFromJson);.....
  • 用我发送的 jsffile 链接替换您的 JSON,然后打开控制台查看您获得的数据 (jsfiddle.net/GSvnh/5087)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-18
相关资源
最近更新 更多