2012-03-01 10 views
7

私はcustomBindingについて簡単に質問してくれます。私は、observableが更新されたときに、そのobservableにバインドされているcustomBindingは、その "update"メソッドが呼び出されると考えました。私はobservableを更新すると、他の加入者に通知されているが、customBindingが呼び出されていないように見えることがわかります。ここで ノックアウト+ customBindingが更新されない

は私のViewModelです:

var innerModel = { 
    name: ko.observable('junk') 
}; 

var innerModel2 = { 
    name: ko.observable('junk2') 
}; 

var viewModel = { 
    im1: innerModel, 
    im2: innerModel2, 
    selectedModel: ko.observable({name:'xxx'}) 
}; 

とここに私のcustomBindingです:

<script id='test' type='text/html' charset='utf-8'> 
<span data-bind='text: name'></span> 
</script> 
:私のテンプレートは、単に "名前" フィールドを表示するスパンで

ko.bindingHandlers.custom = { 
    update: function(element, valueAccessor) { 
     console.log("BAM!"); 
     while (element.firstChild) 
      ko.removeNode(element.firstChild); 

     ko.renderTemplate('test', valueAccessor(), {}, element, 'replaceNode'); 

    } 
}; 

ここに、私がcustomBindingで使用するHTMLを示します。

<div id="container" data-bind="with: viewModel"> 
    <div data-bind="custom: selectedModel"> 
    </div> 
</div> 

selectedModelを2つのinnerModelのいずれかに更新すると、正しい名前が表示されますが、customBindingの 'update'関数は呼び出されません。私は、観察「selectedModel」とは別の加入者があります。

viewModel.selectedModel.subscribe(function(newValue) { 
    console.log(newValue.name()); 
}); 

を、私はselectedModelを変更するときには呼ばれているので、なぜcustomBindingの更新が呼び出されていませんか? http://jsfiddle.net/gperng/twAcJ/

任意の助けいただければ幸いです。ここ

は問題が示しjsfiddleです!

答えて

0

この場合、withの使用は間違っています。あなたの例customに結合するので

<div id="container" data-bind="with: selectedModel"> 
    <div data-bind="custom: $data"> 
    </div> 
</div> 

これはselectedModelではないが、全体のViewModel自体にその変更されません:あなたはこれを使用している場合、それはあなたが期待するように動作します。ここで

はそれのjsfiddleです:http://jsfiddle.net/soniiic/twAcJ/7/

+1

私は100%ではありませんよそれは理にかなっている。 "with"バインディングでdivを取り除くと、私は以前と同じ問題(カスタムバインディングの更新ハンドラが変更されているにもかかわらず呼び出されていない)と同じ問題に陥ります。また、あなたの例では、カスタムバインディングの "init"が毎回呼び出されています(親がobservableであり、変更されているため、下のすべての子要素が再レンダリングされるため)。 http://jsfiddle.net/gperng/6nw8B/を参照してください。私は "init"関数を追加しました。バインディングが毎回再初期化されていることがわかります。 –

9

あなたはそれを動作させるために、次の関数を呼び出す必要があります。

var valueUnwrapped = ko.utils.unwrapObservable(valueAccessor()) 

は、より多くのために、このバイオリンを試してみてください:http://jsfiddle.net/twAcJ/13/

+0

これは実際に私のためには機能しません。 「BAM!」だけが印刷されます。かつて、一度。すべてのボタンを複数回押してもノックアウト3.0.0を選択したことに注意してください(どちらも2.3.0は機能しませんでした)。 – Aktau

関連する問題