试图检查Knockout Observable Array中是否存在对象

时间:2017-05-09 18:57:06

标签: javascript typescript knockout.js

我正在尝试检查一个对象是否具有与可观察数组中具有相同可观察属性的其他对象相同的可观察值。

我创建了一个foreach循环,用于评估是否有任何observable匹配。我遇到的问题是条件总是评估为真,即使这些值不同。我正在使用打字稿和淘汰赛。

以下是代码:

 export function addPDFToPackage(heat: MTRHeat): void {

    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    koHeat.Include = ko.observable(true);

    var arrayOfHeats = model.mtrPackage.Heats();
    var addToHeats = () => model.mtrPackage.Heats.push(koHeat);

    var duplicate = false;

    arrayOfHeats.forEach(function (koHeat, i) {
        if (arrayOfHeats[i].MTRID() == koHeat.MTRID() && arrayOfHeats[i].HeatID() == koHeat.HeatID() && arrayOfHeats[i].PartID() == koHeat.PartID()) {
            duplicate = true;
        }
        else
            duplicate = false;
    })

    if (!!model.mtrPackage.PackageID()) {
        if (duplicate) {
            var c = confirm("Warning: Duplicate MTR located on current package.Proceed ?")
            if (c) {
                ServiceMethods.addHeatToPackage(model.mtrPackage.PackageID(), heat.HeatID).done(addToHeats);
            }
            if (!c) {
                return;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您在此处定义的koHeat之间发生了冲突:

var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
koHeat.Include = ko.observable(true);

forEach调用中定义的变量。它始终返回true(在forEacharrayOfHeats[i] === koHeat的范围内。

试试这个:

 export function addPDFToPackage(heat: MTRHeat): void {

    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    koHeat.Include = ko.observable(true);

    var arrayOfHeats = model.mtrPackage.Heats();
    var addToHeats = () => model.mtrPackage.Heats.push(koHeat);

    var duplicate = false;

    arrayOfHeats.forEach(function (koHeat2, i) {
        if (koHeat2.MTRID() == koHeat.MTRID() && 
            koHeat2.HeatID() == koHeat.HeatID() && 
            koHeat2.PartID() == koHeat.PartID()) {
            duplicate = true;
        }
    })

    if (!!model.mtrPackage.PackageID()) {
        if (duplicate) {
            var c = confirm("Warning: Duplicate MTR located on current package.Proceed ?")
            if (c) {
                ServiceMethods.addHeatToPackage(model.mtrPackage.PackageID(), heat.HeatID).done(addToHeats);
            } else {
                return;
            }
        }
    }
}

答案 1 :(得分:1)

第一个问题:您的循环将每个对象与自身进行比较,因为您重复使用变量名koHeat。我相信你真的想要参考"外部" koHeat

第二个问题:在每次循环迭代中覆盖duplicate变量。这可能不是你想要的。相反,您希望在找到重复后立即停止循环。

这些方面的内容怎么样?

export function addPDFToPackage(heat: MTRHeat): void {
    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    var packageId = model.mtrPackage.PackageID();

    koHeat.Include = ko.observable(true);

    function equals(a: MTRHeatWithInclude, b: MTRHeatWithInclude): boolean {
        return a.MTRID() == b.MTRID() && a.HeatID() == b.HeatID() && a.PartID() == b.PartID();
    }

    if ( !!packageId && (
        !model.mtrPackage.Heats().some(item => equals(item, koHeat)) ||
        confirm("Warning: Duplicate MTR located on current package.Proceed ?")
        )
    ) {
        ServiceMethods.addHeatToPackage(packageId, heat.HeatID).done(() => {
            model.mtrPackage.Heats.push(koHeat);
        });
    }
}

equals()函数理想情况下应该是MTRHeatWithInclude类的方法。