これはこの質問に似ているようです。通常、スクリプトで@ModelをJSONに変換して、ビューモデルを設定します。
<script type="text/javascript">
var model = @(new HtmlString(new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model)));
</script>
コントロール値に基づいてビューモデルを最初にロードする独自のバインディングハンドラーを作成することもできます。この新しいハンドラーは、 initの初期制御値からビューモデルを更新することを除いて、myvalue
基本的に既存のハンドラーを呼び出します。value
ko.bindingHandlers['myvalue'] = {
'init': function (element, valueAccessor, allBindingsAccessor) {
// call existing value init code
ko.bindingHandlers['value'].init(element, valueAccessor, allBindingsAccessor);
// valueUpdateHandler() code
var modelValue = valueAccessor();
var elementValue = ko.selectExtensions.readValue(element);
modelValue(elementValue); // simplified next line, writeValueToProperty isn't exported
//ko.jsonExpressionRewriting.writeValueToProperty(modelValue, allBindingsAccessor, 'value', elementValue, /* checkIfDifferent: */ true);
},
'update': function (element, valueAccessor) {
// call existing value update code
ko.bindingHandlers['value'].update(element, valueAccessor);
}
};
次に、ko.applyBindingsを呼び出すと、最初はコントロールの値に基づいてobservableが設定されます。
<input type="text" data-bind="myvalue: Title" value="This Title will be used" />
<input type="text" data-bind="value: Title" value="This will not be used" />
<!-- MVC -->
@Html.TextBoxFor(m => m.Title, new { data_bind="myvalue: Title"} )
サンプルフィドル