javascript - 从对象的 Knockout observableArray 的第 n 个索引中提取特定字段

标签 javascript jquery knockout.js

我有一个页面,显示使用以下方法构建的文件模板列表。

var loadCustomTemplate = function () {
    loadBaseTemplate();
    var res = 0;
    for (i = 0; i < self.GetSeam().length; i++) {
        var a = self.count() + 1;
        self.count(a);
        res = self.GetSeam()[i].FileFormat.split("_");
        if (res.length == 4) {
            var ap = res[3].split('.');
            self.append(ap[0]);
        } else {
            self.append("");
        }
        var obj = {
            Code: ko.observable(self.code()),
            Number: ko.observable(self.number()),
            SeamReportPath: ko.observable(self.reportPath()),
            FileFormat: ko.observable(self.append()),
            SequenceNumber: ko.observable(a)
        }
        self.CustomTemplate.push(obj);            
    }
    self.count(0);
}; 

然后,用户可以根据需要编辑字段。他们还可以根据需要添加记录或删除记录。添加记录的方法如下。

self.addTemplate = function () {      
    var count = self.CustomTemplate().length + 1;  
    var obj = {
        Code: ko.observable(self.code()),
        Number: ko.observable(self.number()),
        SeamReportPath: ko.observable(self.reportPath()),
        FileFormat: ko.observable(""),
        SequenceNumber: ko.observable(count)
    }
    self.CustomTemplate.push(obj)
};

完成这些更新后,他们可以保存更新的自定义模板。这使用了对这个问题并不重要的ajax。 save 方法调用一个验证方法,该方法应该检查以确保对象数组中没有重复的 FileFormat 字段。这就是我所拥有的,但它失败了。

var validateTemplates = function() {
    for (i = 0; i < self.CustomTemplate().length; i++) {
        var checkVal = self.CustomTemplate()[i].FileFormat;
        var checkSeq = self.CustomTemplate()[i].SequenceNumber;
        for (j = 0; j < self.CustomTemplate().length; j++) {
          if (checkSeq !== self.CustomTemplate()[j].SequenceNumber ){  
            if (checkVal+"" === self.CustomTemplate()[j].FileFormat) {
                if (checkSeq == self.CustomTemplate()[j].SequenceNumber ){
                    return false;
                }
            }                   
        }
    }
    return true;
};

问题是,当检查 self.CustomTemplate()[i].FileFormat 和 self.CustomTemplate()[i].SequenceNumber 时,它没有反射(reflect)页面上显示的数据或发送到 Controller 的数据( MVC 4)。如果我将其中任何一个放入警报中,它就会显示一个功能。如何访问这些特定字段中的数据进行比较?

提前致谢。

最佳答案

If I put either of those in an alert it is showing a function.

那是因为你正在做这样的事情:

var checkVal = self.CustomTemplate()[i].FileFormat;

FileFormatko.observable(...) 的结果,它返回一个函数,因此 checkVal 实际上确实包含一个函数。

解决方案是针对所有这些情况执行以下操作:

var checkVal = self.CustomTemplate()[i].FileFormat(); // Parentheses at the end!

括号执行可观察函数,如果不带参数执行此操作,您将“获取”该可观察函数的值。 (如果您传入一个值,它会将可观察值“设置”为该值。)

关于javascript - 从对象的 Knockout observableArray 的第 n 个索引中提取特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38382805/

相关文章:

javascript - 基础交汇处不改变背景图像

javascript - Ajax 帖子的使用

javascript - 必填字段在 div 内不起作用

jquery - 当内容改变时调整父级的高度?

javascript - 多个元素可见和不可见取决于可观察的

javascript - 加载时文本框默认文本,焦点时文本框为空

页面中的 JavaScript 数据

javascript - Bug - 滑出菜单脚本

javascript - 单击项目动画并显示谷歌地图上相关标记的信息窗口

javascript - Knockout.js Select2 绑定(bind)。 Select2 升级到 v4 后出现故障