2012-03-30 9 views
1

私はknockoutjsモデルが更新される前に、変更の確認を追加したい場所の編集セクションを持っています。ユーザー確認時にknockoutjsビューモデルを更新するにはどうすればよいですか?

ここに私が今持っているもののjsFiddle exampleがあります。 ここに私がしたいことがあります。

  1. ユーザーは
  2. テキストボックスの横にボタンをキャンセル/保存が表示され、編集可能なセクションをクリックします。
  3. ユーザーが変更してクリック保存を行う場合、ビューモデルが
  4. に更新され、ユーザーが変更になりますが、元のコンテンツを維持することを決定した場合、彼らは、キャンセルをクリックし、ビューモデルはtexboxが隠されている、変更されないまま、および編集可能な要素が残ります変わらない。

キャンセルクリックの動作は実装方法がわかりません。どのようにこれを行うことができます誰も提案できますか?

答えて

2

私はこのためにカスタムバインディングハンドラを使用することをお勧めします。 間違いなく機能性を達成するための方法ですが、私はそれがどこへ行くか、クリーン/効率的な方法だかはわからない例http://jsfiddle.net/7v6Dx/10/

Htmlの

<div> 
    <span class="editField"> 
     <span data-bind="text: Address1">Click here to edit</span> 
     <input type="text" data-bind="clickEditor: Address1"> 
    </span> 
</div>​ 

はJavaScript

ko.bindingHandlers.clickEditor = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {   
     var $element = $(element).hide(); 
     var $text = $element.prev(); 
     var $buttons = $("<span class='editConfirm'> \ 
        <button class='saveEdit' type='button'>Save</button> \ 
        <button class='cancelEdit' type='button'>Cancel</button> \ 
       </span>").hide().insertAfter($element); 
     var $editElements = $buttons.add($element); 

     ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
      $buttons.remove(); 
     }); 

     var _toggle = function(edit) { 
      $text[edit? 'hide' : 'show'](); 
      $editElements[edit? 'show' : 'hide'](); 
     } 

     $text.click(function(e) { 
      _toggle(true); 
     }); 

     $editElements.find('.saveEdit').click(function() { 
      _toggle(false); 
      valueAccessor()($element.val()); 
     }); 

     $editElements.find('.cancelEdit').click(function() { 
      _toggle(false); 
      $(element).val(ko.utils.unwrapObservable(valueAccessor())); 
     }); 
    } 
    , update: function (element, valueAccessor) { 
     $(element).val(ko.utils.unwrapObservable(valueAccessor())); 
    } 
}; 

$(document).ready(function() { 
    var helpText = "Click here to edit"; 

    function appViewModel() { 
     this.Address1 = ko.observable(helpText); 
    } 
    ko.applyBindings(appViewModel()); 

});​ 
+0

これはまさに私が探していたものです。 knockoutjsとjQueryの素晴らしい組み合わせで、完全な実例を作成していただきありがとうございます。そこにはたくさんの新しいものがあり、knockoutjsのことでやっていたことを理解するために私は少し研究を要した。 – Jerry

+0

私のサンプルで欠けているのはaddDisposeCallback(これはいくつかのシナリオでは重要かもしれません)を呼び出すことだけです。編集された例。 – Artem

+0

@Artemこの質問を見ることができますpls:[リンク](http://stackoverflow.com/questions/35869093/display-data-from-couchdb-with-knockoutjs/35887453#35887453) – FBC

1

おそらく、これを処理するための書き込み可能な計算されたプロパティを使用できると思っていました。しかし、プロパティを分離するだけで簡単になるかもしれません。 1つは不動産、もう1つは不動産です。編集可能なセクションを表示すると、実際にはシャドウ値にバインドされます。 OKボタンをクリックすると、シャドウ値が実際の値にコピーされます。キャンセルをクリックすると、反対のことが行われます(実際の値をシャドウ値にコピーします)。

+0

それについて。計画はすべてのフィールドにこの保存/取り消し機能を持たせることでした。つまり、私があなたのアプローチを取ったならば、ビューモデル全体のクローンを持たなければならないということです。あなたは、計算されたモデルであなたの最初のアイデアを広げることができますか?私はバインディングを抑制する手段があることを知っていますが、それを防ぐ手段はありますか? – Jerry

+0

@ジャレク:私はちょうどそこにアイデアを投げかけていただけで、実際には私の他のアイデアを賞賛していました。*あなたはまだあらゆる価値のためにバッキングフィールドが必要だと思うので、何かを救いなさい。私は実際に書き込みに影響を及ぼす(またはしない)いくつかの外部トリガー(保存ボタンまたはキャンセルボタンのクリック)が必要なので、どちらかを動作させることができるかどうかはわかりません。たぶん、実際のKOの専門家(約1ヶ月間それを持っている誰かよりも)良いアイデアがありますか? –

+0

お返事ありがとうございますが、Artemはカスタムバインディングを使用してKOメソッドを提供しています。 – Jerry

関連する問題