【问题标题】:Knockout Check If Existing in observableArray before Push在推送之前敲除检查 observableArray 中是否存在
【发布时间】:2015-04-30 09:48:50
【问题描述】:

我是 Knockout 的新手,我有一个小问题阻止我完成我的简单项目。
我有一个名为 loanDeductions 的 observableArray,我显示在一个带有 foreach 绑定的表中。
I have another observableArray called loanDeductionsList which is also from the json data of my first observableArray, I used it in my drop down list which when a value is selected, it will push the selected data to我的桌子。如果它没有意义,因为我无法真正清楚地解释它,这是我的 javascript 文件:

var deductionLine = function (deductionID, deductionName, amount) {
    self = this;
    self.deductionID = ko.observable(deductionID);
    self.deductionName = ko.observable(deductionName);
    self.amount = ko.observable(formatCurrency(amount));
};

function LoanDeductions(deductions) {
    var self = this;
    self.loanDeductions = ko.observableArray(ko.utils.arrayMap(deductions, function (deduction) {
        return new deductionLine(deduction.deductionID, deduction.deductionName, deduction.amount)
    }));
    self.loanDeductionsList = ko.observableArray(ko.utils.arrayMap(deductions, function (deduction) {
        return new deductionLine(deduction.deductionID, deduction.deductionName, deduction.amount)
    }));

    self.selectedDeduction = ko.observable();

    self.selectedDeduction.subscribe(function (data) {
        self.loanDeductions.push({
            deductionID: data.deductionID,
            deductionName: data.deductionName,
            amount: data.amount,
        });
    });
}

你能帮我找到一种方法,让我的函数 selectedDeduction.subscribe() 仅在要推送的项目不存在于我的 loanDeductions observableArray 时推送数据。
任何帮助将不胜感激。谢谢!



我有点意识到我填充下拉列表的方式可能不是最好的方式,我愿意建议更好的方式并重写我的程序。

【问题讨论】:

  • ko.utils.arrayMap 在 LoanDeductions 函数中使用相同的参数被调用了两次。您可以改为声明两个空数组,然后在 for 循环中迭代推导一次,以使用从推导数组中的元素创建的 deductionLine 对象初始化两个数组。这会执行得稍微快一些,并且不会有任何重复的代码。

标签: javascript knockout.js


【解决方案1】:

只是为了分享我所做的,我在 selectedDeduction.subscribe() 中添加了这一行:

self.selectedDeduction.subscribe(function (data) {
        var match = ko.utils.arrayFirst(self.loanDeductions(), function(deduction) {
            return deduction.deductionID() === data.deductionID(); 
        });
        if (match) {
            alert(data.deductionName() + ' already exists!');
        } else {
            self.loanDeductions.push({
                deductionID: data.deductionID,
                deductionName: data.deductionName,
                amount: data.amount,
            });
            }
});

【讨论】:

  • 然后接受它作为答案,让所有人都知道这个问题得到了回答
  • 是的,但我需要等待 2 天才能接受我自己的答案,stackoverflow 限制。
  • 对不起!忘记了!
猜你喜欢
  • 2020-12-14
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多