【问题标题】:Trying to check if object exists in Knockout Observable Array尝试检查 Knockout Observable Array 中是否存在对象
【发布时间】:2017-05-10 03:26:40
【问题描述】:

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

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

代码如下:

 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;
            }
        }
    }
}

【问题讨论】:

  • 您已将 koHeat 推到数组的末尾,我认为这就是返回 true(不是所有元素)。

标签: javascript typescript knockout.js


【解决方案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 类的方法。

【讨论】:

    【解决方案2】:

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

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

    以及在forEach 调用中定义的变量。它总是返回 true 为(在forEach 的范围内)arrayOfHeats[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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-12-13
      • 2017-05-18
      • 1970-01-01
      • 2013-04-22
      • 2023-01-24
      • 2015-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-09-30
      相关资源
      最近更新 更多