Javascript 从Knockout.js选项数组中删除后重新初始化Materialize.css选择框
我有一个选择框,通过Knockout.js处理选项和选择。我想用物化CSS来设计这个样式 对于选择框的初始显示,以及将选项添加到Knockout.js的“options”observableARay时,可以使用“optionsAfterRender”绑定在添加每个选项后(重新)初始化(浪费,但有效) 删除选项时,Knockout.js不提供任何类似于“optionsAfterRender”的功能,因此没有明显的方法触发MaterializeCSS magic的重新初始化 问:你能看到一些非疯狂的选择吗 代码:Javascript 从Knockout.js选项数组中删除后重新初始化Materialize.css选择框,javascript,knockout.js,materialize,Javascript,Knockout.js,Materialize,我有一个选择框,通过Knockout.js处理选项和选择。我想用物化CSS来设计这个样式 对于选择框的初始显示,以及将选项添加到Knockout.js的“options”observableARay时,可以使用“optionsAfterRender”绑定在添加每个选项后(重新)初始化(浪费,但有效) 删除选项时,Knockout.js不提供任何类似于“optionsAfterRender”的功能,因此没有明显的方法触发MaterializeCSS magic的重新初始化 问:你能看到一些非疯狂的
(设置超时是必需的,因为如果没有设置超时,则不会选择所选选项。)A更适合将自定义UI组件(如material\u select
与KnockoutJS集成。以下是构建此类处理程序的一种方法:
ko.bindingHandlers[“materializeSelect”]={
之后:[“选项”],
init:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
//初始初始化:
$(元素).material_select();
//查找“选项”子绑定:
var boundValue=valueAccessor();
//在“选项”更改时注册回调:
boundValue.options.subscribe(函数(){
$(元素).material_select();
});
},
更新:函数(元素、valueAccessor、allBindings、viewModel、bindingContext){
}
};
函数RootViewModel(){
var self=这个,i=2;
self.options=ko.observearray([{id:1,txt:“Option A”},{id:2,txt:“Option two”}]);
self.selectedOption=ko.可观察(空);
//出于测试目的:
self.addOption=function(){self.options.push({id:++i,txt:“动态选项”+i});};
}
applyBindings(新的RootViewModel())代码>
动态添加选项
Jeroen的回答很好,也很正确,我想用SO注释添加一个附录,但我认为完整的格式更好
当放置在select上时,Materialize对disable
绑定的响应似乎有点奇怪,特别是当该禁用依赖于另一个敲除可观察对象(通常是这样)的更新时
我在更新功能中使用以下功能:
if(allBindings().disable != undefined && allBindings().disable == true){
$(element).prop("disabled", true);
}
else{
$(element).prop("disabled", false);
}
$(element).material_select();
我最初尝试在update函数中调用$(element).material\u select()
,但它似乎有点不可靠,只在某些时候起作用。显式更改元素上的disabled属性似乎每次都有效
可能有一种更简洁的方法可以做到这一点,但希望这个示例能够说明这一点:根据绑定的状态显式设置disabled属性
我不知道使用其他绑定时是否会遇到类似的问题,可见
等,但如果是,这些问题可能会以类似的方式得到解决。我通常称之为。material\u select('destroy')代码>在重新输入之前,只是为了确定。materializecss有点年轻,我渴望得到一个完美的工作答案——这也解决了我遇到的下一个问题,即如何在KO模型中的值更改后重新初始化!
if(allBindings().disable != undefined && allBindings().disable == true){
$(element).prop("disabled", true);
}
else{
$(element).prop("disabled", false);
}
$(element).material_select();