我试图找出如何将自定义jQuery事件订阅到Knockout 3.2视图模型的最佳方法。
我正在使用FuelUX树控件,并且当有人选择树项目时,我想将所选对象推送到我的视图模型observable。
FuelUx控件有一个内置的jQuery事件来处理单击并返回附加到DOM元素的所选jQuery数据对象的函数。以下是基本代码
$('#myTree').on('selected.fu.tree', function (evt, data) {
var selectedArray = $('#myTree').tree('selectedItems'); //fuelux custom event
ko.utils.arrayForEach(selectedArray, function (bnd) {
if (bnd) {
self.linked_documents.push(new DocFile(bnd.dataAttributes.document));
}
});
});
我看过以下内容,也许这是正确的做法。但是,任何建议/建议都将受到赞赏。
http://knockoutjs.com/documentation/unobtrusive-event-handling.html
谢谢, 格雷格
答案 0 :(得分:2)
不要被“事件”术语所迷惑,event
绑定主要用于绑定DOM事件。相反,您可以使用custom binding handler将视图的一部分连接到UI插件。
例如:
ko.bindingHandlers["fuelEX"] = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
$(element).on('selected.fu.tree', function (evt, data) {
// Modify your view model here in response to the plugin's event
var observable = valueAccessor();
observable(observable() + 1);
});
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// Update the DOM element based on the supplied values here.
}
};
ko.applyBindings({
counter: ko.observable(1),
simulateFuelEXEvent: function() { console.log('hai'); $("#fuel").trigger("selected.fu.tree"); }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div id="fuel" data-bind="fuelEX: counter"></div>
<p>Counter value: <span data-bind="text: counter"></span></p>
<p><button data-bind="click: simulateFuelEXEvent">Simulate event</button></p>