knockout.js - 在淘汰赛自定义绑定中,您如何知道哪个值触发了更新?
问题描述
B"H
我正在开发一个基于淘汰赛 js 的旧项目。我正在尝试创建一个自定义绑定(用于 select2),但我遇到了一堵砖墙,试图找出哪些属性(值)是改变的。
即我怎么知道选项列表是否刚刚改变?还是选择的值?
如果值列表刚刚更改,那么我需要重建 select2,将控件值设置为 null(否则默认选择第一项)。如果用户只是在列表中选择了一个项目,那么我真的不想做任何事情。绝对不要重建整个控件或将控件值设置为空。但是我找不到任何方法来查看哪些值发生了变化。
解决方案
Knockout 中的每个 observable 都有订阅方法,所以如果你有
var myProp = ko.observable();
您可以订阅此道具的更改并在那里做所有必要的事情:
myProp.subscribe(function(newValue){
console.log("value of prop changed to " + newValue);
});
我们确实通过以下方式为 jquery selected 插件实现了自定义选择绑定:
ko.bindingHandlers.chosen =
{
init: function (element, valueAccessor, allBindings) {
var values = valueAccessor(),
$element = $(element);
$element.chosen(ko.toJS(values));
if (ko.isObservable(values.enable)) {
values.enable.subscribe(function (value) {
$element.prop('disabled', !value).trigger("chosen:updated");
});
}
// trigger chosen:updated event when the bound value or options changes
['value', 'selectedOption', 'options'].forEach(function (e) {
var bv = allBindings.get(e);
if (ko.isObservable(bv))
bv.subscribe(function () { $(element).trigger('chosen:updated'); });
});
var prop = allBindings.get('value');
$element.off('change');
$element.on('change', function (obj, event) {
if (!event || !prop) {
return;
}
if (typeof (prop()) == "number" && !isNaN(Number(event.selected))) {
prop(Number(event.selected));
} else {
prop(event.selected);
}
});
},
update: function (element) {
$(element).trigger('chosen:updated');
}
};
推荐阅读
- ruby-on-rails - 如何在使用 rspec 测试类中的任何方法之前初始化通用上下文变量
- node.js - NPM 不安装需要构建的依赖项
- tfs - 如何最好地从 VSTS 下载源文件?
- c# - 在 Xamarin 项目中使用 Entity.FrameworkCore.Sqlite 时找不到程序集“System.Memory”
- angular - 迁移 Angular 5 到 6 - 'ng update' 挂起并且什么也不做
- reactjs - 在 React 中删除项目
- node.js - 从 Firestore 检索数据以显示在 DialogFlow 中
- r - 如何使 top_n() 反应?在函数内使用 input$x ?
- unity3d - Unity vimeo sdk 流无法在 android 上运行
- elasticsearch - ElasticSearch NEST 5.6.1 查询单元测试