カスタムテンプレートバインディングでknockoutjsを使用する際に問題が発生しました。
次のようなHTML本文があるとします。
<div id="1">
<div data-bind="template:{name: '2', data: data}"></div>
</div>
<div id="2">
<h3 data-bind="text: caption"></h3>
</div>
JSコードは次のようになります。
var ViewModel2 = function () {
this.caption = ko.observable("Caption");
}
var ViewModel1 = function () {
this.data = new ViewModel2();
}
ko.applyBindings(new ViewModel1(), document.getElementById("1"));
このコードをテストすると、すべてが正常に機能します。
JSFiddleの例を参照してください:http://jsfiddle.net/4eTWW/33/
ここで、カスタムテンプレートバインディングを作成するとします。'template'の代わりに'templatex'バインディングを使用します。
HTMLでは、1行だけ変更する必要があります。
<div data-bind="templatex:{name: '2', data: data}"></div>
次に、カスタムテンプレートバインディングをJSに追加しましょう。
/*Custom binding*/
ko.bindingHandlers.templatex = {
init: function (element) {
ko.bindingHandlers.template.init.apply(this, arguments);
},
update: ko.bindingHandlers.template.update
}
参照: http: //jsfiddle.net/4eTWW/35/
ただし、この場合、モデルに「キャプション」が見つからないというエラーが発生します。
次に、テンプレート{}をhtmlバインディングに追加しましょう。
<div data-bind="template: {}, templatex:{name: '2', data: data}"></div>
参照: http: //jsfiddle.net/4eTWW/36/
そして今、すべてがうまく機能します。
親divをバインドしている間、子divがテンプレートであると判断できないようです。
では、カスタムテンプレートバインダーでテンプレートとしてマークするにはどうすればよいですか?
ありがとう。