2012-01-24 22 views
6

データタイプに基づいて編集モードと読み取り専用モードの間で切り替えることができる包括的なノックアウトテンプレートを設定しようとしています。 ASP.NETの動的データを使用したことがある場合:フィールドテンプレートと似ています。たとえば:

<script type="text/html" id="text"> 
    <!-- ko if: $root.editable --> 
     <input type="text" data-bind="value: $data" /> 
    <!-- /ko --> 

    <!-- ko ifnot: $root.editable --> 
     <span data-bind="text: $data"></span> 
    <!-- /ko --> 
</script> 

これは次のように使用されます。

var viewModel = { 
     name: ko.observable("Brian"), 
     editable: ko.observable(true) 
    }; 

アイデアのようなフィールドレベルでテンプレートを使用できるようにすることです:次のビューモデルで

<label><input type="checkbox" data-bind="checked: editable" /> Editable</label> 

<p>Name: <input data-bind="value: name" /></p> 
<p>Name2: <span data-bind="template: { name: 'text', data: name }"></span></p> 

明示的な要素/コントロールではなく、 "Name2"の例で使用します。これにより、大部分が重複したマークアップの大部分を持たずに、フォーム全体を編集モードと読み取りモードの間で簡単に切り替えることができます。これはまた、鋳型内部$data擬似変数バインディング双方向ていない問題

等、例えば、日付フィールドのdatepickersを使用して、共通データタイプ編集/表示マークアップの再利用を可能にします。これはオブザーバブルの現在の値を反映しますが、入力コントロールの変更によって値が設定されることはありません。

$dataではどのようにして双方向バインディングを取得できますか?

も参照してくださいthis jsfiddle

答えて

7

最も簡単な選択肢はそれはあなたが実際に観察のようにアクセスすることを可能にするバインディングオブジェクトをテンプレートに渡すことです:

template: { name: 'text', data: {field: name} } 

次に、「フィールド」の代わりに "に対するバインドを$ data "をテンプレートに追加します。考慮すべき

もう一つは、あなたがのように編集/表示用に別のテンプレートを使用することができ、あなたのテンプレートを決定するための機能を使用することになります
http://www.knockmeout.net/2011/03/quick-tip-dynamically-changing.html

+0

ありがとうございます!あなたはライアンだ! –

+0

私は '$ data'と' $ item'キーワードを使用しています - テンプレートはレンダリングされませんが、ViewModelフィールド名で 'foreach'で渡された要素にアクセスすると、すべて正常に動作します。 viewModelのユーザ配列(単一の 'name'フィールド)を持つと、' name'へのバインディングはテンプレートで動作しますが、 '$ data'や' $ item'を使っているときは動作できません。例えば、 ''は動作しませんが、 '' ' $ item、$ data'このような問題を引き起こす原因は何ですか?ありがとう – sll

+0

おそらくあなたはjsFiddleであなたの問題を作成することができますか? '$ item'はjQueryテンプレートでのみ利用可能です。 '$ data'がオブジェクトであれば、それをテキストバインディングに渡したくないので、' text:name'や 'text:$ data.name'(2番目の構文は未定義を助けます)をしたいでしょう。 –

関連する問題