我有一个在我看来初始化的第三方控件:
<!--<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)。
答案 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);
},
})
}