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