如何从自定义绑定处理程序中的自定义函数中获取数据到viewmodel中?

时间:2013-09-11 20:48:34

标签: knockout.js dynatree

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

<!--<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)中的值“警告”到我的viewmodel中的一个observable中。当事件被触发在树视图的“内部”并由activate方法处理时,我无法看到如何将node.title放入隐藏在根视图模型中的observable($ root.selectedTitle)。

2 个答案:

答案 0 :(得分: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;
    //...

答案 1 :(得分: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);
        },
    })
}