我正在尝试让 Knockout 和 Bootstrap-TreeView 一起工作。(组件:https ://github.com/jonmiles/bootstrap-treeview )
目前,我将来自 API 调用的 JSON 传递给 View Model 的构造函数。这将在稍后更改,但为简单起见,我正在这样做。
然后我需要将点击事件绑定到每个节点。因此,如果我单击根节点,什么也没有发生,单击一个文件夹,我可以获得所有它的直接子文本值的列表(现在只是提醒它们),如果我单击一个文件节点,我会提醒“数据”该节点的值。
这是一个小提琴,看看我到目前为止做了什么。
https://jsfiddle.net/Cralis/h15n2tp7/
我的视图模型只是使用 json 数据进行初始化。然后在视图模型中计算一个树视图的设置。
// Create the View Model.
var ViewModel = function(jsonData) {
var self = this;
self.MyData = ko.observable(jsonData);
ko.computed(function() {
$('#tree').treeview({
data: self.MyData()
})
.on('nodeSelected', function(event, data) {
if (data.nodeLevel == 2) { // Are we clicking a File?
alert("Clicked a File. Data: " + data.data)
}
else
if(data.nodeLevel == 1) { // We're clicking a folder.
alert("Clicked a folder. Would like to somehow alert a list of all child node text values.")
}
});
})
}
// Create the View Model and initialise with initial data
var vm = new ViewModel(getTree());
// Bind.
ko.applyBindings(vm, document.getElementById("bindSection"));
这行得通,但我认为我使用的淘汰赛不多。那是因为我的点击事件在我的 javascript 中,而我的 Knockout 视图模型实际上并没有任何控制。
如何让 Knockout 能够“看到”点击事件。因此,单击一个节点,计算出的淘汰赛(我认为?)会触发,然后我可以根据绑定事件控制 UI。
除此之外,我有一个显示文件列表的 DIV。我是这样的,当一个文件夹级别的节点被选中时,我可以使用来自该选定文件夹节点的子节点的所有“文本”值填充该 div。
关于我如何实现这一目标的任何指示都会令人惊叹。我只是不确定如何到达data-bind="click...
节点,然后节点可以运行当前在我的小提琴中的“onclick”中的代码。