gpt4 book ai didi

javascript - 使用带有 knockoutjs 2.1 的 prettyCheckable 插件检查数据绑定(bind)不起作用

转载 作者:行者123 更新时间:2023-11-30 08:55:11 24 4
gpt4 key购买 nike

我正在使用 prettyCheckable jquery 插件使我的复选框和单选按钮看起来很漂亮,如果我使用 data-bind="checked: dateMode"它不起作用,因为插件隐藏了实际的复选框并使其自己覆盖html 来美化复选框/ radio ,因此当我检查 radio 或复选框并更新模型中的值时,knockoutjs 库无法识别。我知道如果我不使用 prettyCheckable 插件我的代码工作正常,所以不要告诉我我的模型或数据绑定(bind)代码搞砸了。我对此进行了测试。

https://github.com/arthurgouveia/prettyCheckable

这是我的部分 View 代码。

<div id="DatesChooser" class="span5 pull-left">
<h4><i class="icon-calendar"></i>Dates</h4>
<input type="radio" name="Date" value="All" data-label="All Available" data-bind="checked: dateMode" /><br />
<input type="radio" name="Date" value="Range" data-label="Range" data-bind="checked: dateMode" />
<div data-bind="visible: dateMode() == 'Range'">
<input type="text" id="FromYear" placeholder="1970" /> to
<input type="text" id="ToYear" placeholder="2012" /><br />
<div id="Date-Slider" class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
<div id="Date-Slider-Bar" class="ui-slider-range ui-widget-header" style="left: 0%; width: 100%;"></div>
<a class="ui-slider-handle ui-state-default ui-corner-all" href="#" style="left: 0%;"></a>
<a class="ui-slider-handle ui-state-default ui-corner-all" href="#" style="left: 100%;"></a>
</div>
</div>
</div>

这是我的 knockout 模型:

function searchVm() {
var self = this;
self.dateMode = ko.observable("All");
self.startSearch = function () { alert(self.dateMode()); };
};

然后我像这样初始化 prettyCheckable 的东西:

$('input:checkbox').prettyCheckable();
$('input:radio').prettyCheckable();

这是代码在 prettyCheckable 插件修改后呈现的样子,请注意输入样式是“display:none”:

<div id="DatesChooser" class="span5 pull-left">
<div class="clearfix prettyradio labelright blue">
<input type="radio" data-bind="checked: dateMode" data-label="All Available" value="All" name="Date" style="display: none;" checked="checked">
<a class="checked" href="#"></a>
<label for="undefined">All Available</label>
</div>
<br>
<div class="clearfix prettyradio labelright blue">
<input type="radio" data-bind="checked: dateMode" data-label="Range" value="Range" name="Date" style="display: none;">
<a class="" href="#"></a>
<label for="undefined">Range</label>
</div>
<div data-bind="visible: dateMode() == 'Range'" style="display: none;">
<input id="FromYear" class="placeholder" type="text" placeholder="1970">
to
<input id="ToYear" class="placeholder" type="text" placeholder="2012">
<br>
<div id="Date-Slider" class="ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
<div id="Date-Slider-Bar" class="ui-slider-range ui-widget-header" style="left: 0%; width: 100%;"></div>
<a class="ui-slider-handle ui-state-default ui-corner-all" style="left: 0%;" href="#"></a>
<a class="ui-slider-handle ui-state-default ui-corner-all" style="left: 100%;" href="#"></a>
<div class="ui-slider-range ui-widget-header" style="left: 0%; width: 100%;"></div>
</div>
</div>
</div>

最佳答案

Pretty Checkable 会触发复选框上的 change 事件,但 Knockout 会查找 click 事件。这可以通过更改 prettyCheckable.js 第 46-54 行来解决。原文:

    if (input.attr('checked') !== undefined) {
input.removeAttr('checked').change();
} else {
input.attr('checked', 'checked').change();
}

更改:

    if (window.ko) {
ko.utils.triggerEvent(input[0], 'click');
} else {
input.click();
}

如果您使用 jQuery 的 click 触发函数,Knockout 也将不起作用。您必须如上所述使用 Knockout 的 triggerEvent

jsFiddle:http://jsfiddle.net/mbest/4cX48/

关于javascript - 使用带有 knockoutjs 2.1 的 prettyCheckable 插件检查数据绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14148901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com