我有一个选择框,其中的选项和选择是通过 Knockout.js 处理的。我想使用 Materialize CSS 设计它的样式。
此功能可正常用于选择框的初始显示,并且当将选项添加到optigon.js'options'observablearray时,通过使用“options fafterrender”绑定(bind)在添加每个选项后的(re re ret)初始化(浪费,浪费,但有效)。
删除选项时,Knockout.js 不提供类似于“optionsAfterRender”的任何内容,因此没有明显的方法来触发 Materialize CSS 魔法的重新初始化。
问题:您是否可以看到任何非疯狂的选项?
代码:
<select data-bind="
options: options,
optionsText: function(item) { return optionsText[item] },
value: displayedValue,
optionsAfterRender: function (option, item) {
setTimeout(function() {
$(option.parentElement).material_select();
}, 0);
}
">
</select>
('setTimeout' 是必需的,否则不会选择所选的选项。)
最佳答案
A custom binding handler更适合将自定义 UI 组件(如 material_select)与 KnockoutJS 集成。下面是构建此类处理程序的一种方法:
ko.bindingHandlers["materializeSelect"] = {
after: ['options'],
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// Initial initialization:
$(element).material_select();
// Find the "options" sub-binding:
var boundValue = valueAccessor();
// Register a callback for when "options" changes:
boundValue.options.subscribe(function() {
$(element).material_select();
});
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
}
};
function RootViewModel() {
var self = this, i = 2;
self.options = ko.observableArray([{id: 1, txt: "Option A"}, {id: 2, txt: "Option two"}]);
self.selectedOption = ko.observable(null);
// For testing purposes:
self.addOption = function() { self.options.push({id: ++i, txt: "Dynamic option " + i}); };
}
ko.applyBindings(new RootViewModel());<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>
<script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.4/js/materialize.min.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.97.4/css/materialize.min.css" rel="stylesheet"/>
<select data-bind="materializeSelect: { options: options },
options: options,
optionsText: 'txt',
value: selectedOption">
</select>
<button data-bind="click: addOption">Add option dynamically</button>
老实说,我觉得这是一个问题/遗漏,甚至可能是 MaterializeCSS 中的一个错误,它显然没有注意到 select 选项的变化。 IIRC 库(例如 Select2 和 Chosen) 具有此功能。
无论如何,如果 MaterializeCSS 会正确地注意到动态添加的选项,我仍然建议使用自定义绑定(bind)处理程序,只是一个更简单的处理程序:
ko.bindingHandlers["materializeSelect"] = {
after: ['options'],
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
$(element).material_select();
},
update: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
// Handle ViewModel changes of which MaterializeCSS needs custom
// notification here.
}
};
关于javascript - 从 Knockout.js 选项数组中删除后重新初始化 Materialize.css 选择框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34393346/
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife