2016-06-12 37 views
0

我有以下JS對象:敲除驗證內可觀察到的驗證沒有triggred

var Player = function() { 

     var self = this; 

     self.FirstName= ko.observable().extend({ 
      required: { 
       message: 'Player First Nameis required.' 
      } 
     }); 

     self.LastName= ko.observable().extend({ 
      required: { 
       message: 'Player Last Name is required.' 
      } 
     }); 
    } 

var form= function() { 

    var self = this; 

    self.Name = ko.observable().extend({ 
     required: { 
      message: 'Name is required.' 
     } 
    }); 
    self.Manager = ko.observable().extend({ 
     required: { 
      message: 'Manager is required.' 
     } 
    }); 
    self.Email = ko.observable().extend({ 
     required: { 
      message: 'Email is required.' 
     }, 
     email: { 
      message: 'Entered Email is not valid.' 
     } 
    }); 

    self.Players = ko.observableArray([]); 

} 

Players陣列在上述JS目的是使用以下JS對象使用new Player()語法填充

我已經使用了knockout-validation庫的以下設置:

ko.validation.init({ 
    registerExtenders: true, 
    messagesOnModified: true, 
    insertMessages: false, 
    parseInputAttributes: true, 
    messageTemplate: null, 
    decorateInputElement: true, 
    errorElementClass: 'error', 
    grouping: { 
     deep: true, 
     observable: true 
    } 
}, true); 

我使用viewModel.errors.showAllMessages()來顯示視圖模型中的所有錯誤消息。我面臨的問題是player對象的驗證沒有被觸發,因爲它存在於Form對象中。我甚至將deep屬性設置爲true,但即使這樣做不起作用,可能會出現什麼問題?

+0

你可以設置一個有用的小提琴嗎?即使你使用'validatedObservable'。 –

+1

請嘗試將您的代碼擴展到[mcve]。如果我自己這樣做,並添加缺少的部分來啓動和運行(但堅持你提供的代碼逐字),[它按預期工作,玩家姓氏得到驗證就好](https://jsfiddle.net/jeroenheijmans/2a7t72be /)。 – Jeroen

回答

0

簡短的回答是,您將需要使用{live:true}來跟蹤添加到可觀察數組的對象的錯誤。

較長的答案:

我用的Jeroen的小提琴爲出發點,並假定你想要的是顯示錯誤消息的所有球員都可驗證的觀測。

使用ko.validation.group(vm,options)獲取錯誤列表。它是顯示showAllMessages函數的返回對象(計算的observable返回一組錯誤)。

默認情況下,它不會執行提供的視圖模型的深度遍歷,因此您只會爲名稱,管理器和電子郵件屬性(因爲我認爲您正在獲取當前)獲取錯誤。

要使用深度遍歷,可以提供{deep:true}選項。這應該會給你錯誤的時間函數被調用時在陣列中的所有玩家。

如果您希望在功能被調用後追蹤添加到可觀察陣列(您的案例中的玩家)的對象,則可以使用{live:true}選項。它將在陣列上創建訂閱,並在每次修改數組時更新錯誤列表。下面是添加它的問題:https://github.com/Knockout-Contrib/Knockout-Validation/pull/223

下面是相關文檔片斷,這裏是小提琴: https://jsfiddle.net/2a7t72be/1/

var form = function() { 
    var self = this; 

    self.showErrors = function(){ 
     self.errors.showAllMessages(); 
    }; 

    // ... 

    self.Players = ko.observableArray([]); 

    self.errors = ko.validation.group(self, { deep: true, live: true }); 
} 

PS。調用validation.init時,您當然可以配置分組選項(只需在您致電之前執行)。