2014-06-09 63 views
0

我想與Knockout.validation一起使用Knockout.mapping來創建一個簡單的驗證視圖模型。我碰到函數,並認爲這將適合我的需要,但似乎options.parent屬性沒有設置爲我所期望的:傳遞給創建的選項有無效的父項?

這是我正在使用的基本代碼或你可以看到一個JSFiddle

var o = { 
    test: { 
     value: "bob", 
     validation: "{ required: true; }" 
    } 
}; 
var mapping = { 
    'value': { 
     create: function (options) { 
      console.log(options.parent === o.test); 
     } 
    } 
}; 

var vm = ko.mapping.fromJS(o, mapping); 

我做錯了什麼,或者這是一個錯誤?我的最終目的是我想打電話給大意如下的創造的東西:

create: function(options) { 
    var result = ko.mapping.fromJS(options.data); 
    if(options.parent.validation !== undefined) { 
     result.extend(options.parent.validation); 
    } 

    return result; 
} 

如果這是剛剛打破任何人能想到的解決該問題的任何比較簡單的方法呢?我到目前爲止唯一提出的解決方案是遞歸屬性搜索,以手動擴展observables,這感覺像是很多不必要的複雜性。

回答

1

我在我的項目做的是增加一個id檢查父,是這樣的:

var o = { 
    test: { 
     id: "1", 
     value: "bob", 
     validation: "{ required: true; }" 
    } 
}; 
var mapping = { 
    'value': { 
     create: function (options) { 
      console.log(options.parent.id() === o.test.id); 
     } 
    } 
}; 

測試here

+0

我嘗試調試之前,我開始,以驗證我已經添加了以下行'console.log('驗證:'+ options.parent.validation);'哪些日誌'未定義' – Ian

+0

它的原因是option.parent映射對象不是原始數據。並且它們按照他們聲明的相同順序映射它們,在驗證之前定義了值 – Anders

+0

您是否嘗試過我的小提琴? –

0

其更好地創建明確的ViewModels,然後使用映射插件來填充他們像

ViewModel = function(data) { 
    this.value = ko.observable().extend({ required: true }); 
    ko.mapping.fromJS(this, {}, data); 
}; 
+0

這是一個非常簡單的例子來證明這個問題。因爲字段是動態創建的,所以我不能顯式擴展這樣的值。 – Ian

相關問題