knockout.js 如何处理绑定:在变更observableArray中的数据之后执行foreach

xggvc2p6  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(168)

我正在修改一个observableArray,在一个订阅事件中修改一些数据。首先,我使用ko.toJS()转换ObservableArray,通过数据进行Map,然后进行修改。最后,我调用self.menuCategories(jsArray)再次设置observableArray。
看起来我好像在某种程度上失去了与observableArray的“连接”,因为我的代码中的foreach语句突然中断了。
要么有一个非常简单的方法来处理这个问题,要么我没有正确地处理可观察性。

代码:

var MenuWizardModel = function() {
   var self = this;
   self.menuCategories = ko.observableArray();
   self.commonDiscount = ko.observable(0);

   // Handling adding items to menuCategories.
   self.addNewSubMenuItem = function () {
        var newSubMenuItem = new SubMenuItemViewModel(self.newSubMenuItemName(), []);
        self.menuCategories.push(newSubMenuItem);
        self.newSubMenuItemName(null);
        self.createNewSubMenu(false);
    }

  function SubMenuItemViewModel(name, foodItemList) {
       var self = this;
       self.name = ko.observable(name);
       self.foodItemList = ko.observableArray(foodItemList);
  }

   self.commonDiscount.subscribe(function(val) {
        var discount = parseInt(val) / 100;
        var jsArray = ko.toJS(self.menuCategories);
        console.log(jsArray)
        jsArray = ko.toJS(jsonArray[0].foodItemList.map(item => {
            item.price = parseInt(item.price) - (parseInt(item.price) * discount);
            return item;
        }));
        self.menuCategories(jsArray);
    });

标记:

<div data-bind="foreach: menuCategories">
          <h4 data-bind="text: name"></h4>
          <div data-bind="foreach: foodItemList" class="list-group">
          ...

数据:

y53ybaqx

y53ybaqx1#

我认为处理这类事情的最好方法是在fooditem中添加一个计算出的可观察项,它捕捉全局折扣并计算折扣价格。
如下所示。
第一个

相关问题