2016-07-14 29 views
1

我有一個顯示使用以下方法構建的文件模板列表的頁面。從Knockout observableArray對象的第n個索引中提取特定字段

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

一旦進行了這些更新,他們可以保存更新後的CustomTemplate。這使用了對這個問題不重要的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().SequenceNumber它不反射顯示頁面上的數據或將數據發送[I]到控制器(MVC 4)。如果我將其中的任何一個置於警報中,它將顯示一個功能。如何訪問這些特定領域的數據進行比較?

在此先感謝。

+0

敲除可觀察值是函數。爲了設置它們的值,你可以用一個參數來調用它們。爲了獲得他們的價值,你可以不帶參數地給他們打電話。 I.e .:'var a = ko.observable(1); a2); console.log(a());'打印'2' – user3297291

回答

1

如果我把它們中的任何一個置於警報中,它將顯示一個函數。

那是因爲你正在做這樣的事情:

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

FileFormatko.observable(...)的結果,它返回一個功能,其實也包含了一項功能,checkVal

的解決方案是所有這些情況下做到這一點的:

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

括號執行可觀察到的功能,如果你不帶參數做,你「搞定」可觀察的價值。 (如果您傳遞一個值,它會將可觀察值設置爲該值。)

+0

謝謝!還在習慣Knockout的來龍去脈。 –

相關問題