0

ビューで初期化されたサードパーティ コントロールがあります。

<!--<ul data-bind="template: { name: 'itemTmpl', foreach: treeGroups }, groupTree: {}"></ul>/-->

カスタム バインディング ハンドラーを使用する場合:

ko.bindingHandlers.groupTree = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var tm = valueAccessor();
        var tmUnwrapped = tm();
        $(element).fancytree({
            minExpandLevel: 1,
            source: tmUnwrapped,
            lazyload: function (e, data) {
                data.result = datacontext.getGroupChildren('1111');
            },
            activate: function (event, data) {
                //logEvent(event, data);
                var node = data.node;
                // access node attributes
                alert(node.title);
            },

        })
    },

私ができるようにしたいのは、現在「アクティブ化」メソッド(node.title)で「アラート」している値をビューモデルのオブザーバブルに取得することだけです。イベントがツリービューの「内部」でトリガーされ、activate メソッドによって処理されるため、ルート ビューモデル ($root.selectedTitle) に埋め込まれているオブザーバブルに node.title を取得する方法がわかりません。

4

2 に答える 2

0

カスタム バインディングは、含まれているビューから bindingcontext を自動的に継承するため、カスタム バインディング ハンドラーで bindingcontext から $root モデルにアクセスするだけで済みます。

ko.bindingHandlers.groupTree = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
    var rootVm = bindingContext.$root;
    $(element).fancytree({
        minExpandLevel: 1,
        source: tmUnwrapped,
        lazyload: function (e, data) {
            data.result = datacontext.getGroupChildren('1111');
        },
        activate: function (event, data) {
            var node = data.node;
            rootVm.selectedArticle(node.title);
        },
    })
}
于 2013-09-13T13:10:36.790 に答える