0

我有一个在我看来已初始化的第 3 方控件:

<!--<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)中“警告”的值转换为我的视图模型中的可观察值。由于事件是在树视图的“内部”触发并由激活方法处理的,所以我看不到如何将 node.title 放入埋在根视图模型($root.selectedTitle)中的可观察对象中。

4

2 回答 2

1

$root$parent伪变量仅在数据绑定的上下文中可用。但是,您可以将这些值传递到您的自定义绑定中,如下所示:

//in your view
data-bind="groupTree: {rootVm: $root}"

//in your binding
init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
    var settings = valueAccessor();
    var rootVm = settings.rootVm;
    //...
于 2013-09-11T21:17:28.083 回答
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 回答