如何防止Knockout覆盖我的初始复选框值
How to prevent Knockout from overwriting my initial checkbox value?
我有一个表单,通过浏览器正常加载,并与Laravel填充,但使用Knockout.js和AJAX页面更新到服务器:
{{ Form::checkbox('launch_time_change', 'launch_time_change', true, array('data-bind' => checked: emailNotifications.launch_time_change')) }}
这里的第三个参数表示页面加载时复选框的状态,如您所见,它已被选中。
但是,我想随后将此值发送到Knockout,以便可以在服务器上更新复选框而无需重新加载页面。这需要将复选框值存储在ko.observable()
中,但是每当我尝试将checked
绑定应用到复选框字段时,默认状态都会被覆盖。
在上面的例子中,当Knockout初始化ViewModel中的可观察对象时,在页面加载时被选中的复选框将被取消选中。遗憾的是,这是预期的行为:
KO将元素的选中状态设置为与参数值匹配。任何先前选中的状态都将被覆盖。
我怎样才能阻止这种情况的发生?
嗯,考虑到我的应用程序主要是基于larvel的,我选择了一条完全不同的路线。
我决定使用Jeffrey Way的laracasts/utilities
repo来创建一个Javascript
facade,在那里我可以把Javascript变量放在我的视图上,像这样:
JavaScript::put([
'emailSubscriptions' => someValue
]);
可以在全局任何地方访问,在附加到window
对象的命名空间变量中:
console.log(laravel.emailSubscriptions) // "someValue"
它不应该污染全局作用域,因为在config.php
下:
/*
|--------------------------------------------------------------------------
| JavaScript Namespace
|--------------------------------------------------------------------------
|
| By default, we'll add variables to the global window object.
| It's recommended that you change this to some namespace - anything.
| That way, from your JS, you may do something like `Laracasts.myVar`.
|
*/
'js_namespace' => 'laravel'
工作得很好,而且它可以在任何地方访问,而不仅仅是内联。不需要通过构造函数传递或发出单独的AJAX请求。
使用Knockout的另一种答案是创建一个不覆盖输入值的新value
绑定。
ko.bindingHandlers.dont_clear_init_value = _.extend({},
ko.bindingHandlers.value,
{
init: function(element, valueAccessor, allBindings) {
if (ko.isObservable(valueAccessor()))
valueAccessor()(ko.selectExtensions.readValue(element));
ko.bindingHandlers.value.init(element, valueAccessor, allBindings);
}
}
);
如何在模板中使用
<p>Login name: <input data-bind="dont_clear_init_value: userName" /></p>
<p>Password: <input type="password" data-bind="dont_clear_init_value: userPassword" /></p>
<script type="text/javascript">
var viewModel = {
userName: ko.observable(),
userPassword: ko.observable(),
};
</script>
相关文章:
- 正在验证8个真/假复选框或复选框中的2个
- 使用jQuery只返回选中复选框后的第一个表单元格值
- Javascript:显示带有复选框值的图像
- 如何创建php函数或任何脚本/jquery Javascript,使我能够获取与复选框关联的值并添加它们
- Rad网格编辑模式通过选中复选框时的java脚本启用禁用所需的字段验证器
- 基于复选框状态的条件数学
- 禁用复选框上的输入框 jquery NO onchange
- 如何使用 JavaScript 获取复选框项的值
- 复选框组获取选中复选框jquery的值
- 如何捕获复选框上的双击
- jquery选择复选框选择的值
- 通过复选框上的onClick或onChange触发表单填写
- jquery/javascript取消选中除单击的复选框之外的所有复选框
- 创建一个复选框按钮的散列,这些按钮在单击时在Twitter Bootstrap Button组中处于活动状态
- JS将复选框中的值添加到URL,然后单击转到URL
- 如何添加复选框选中的计数值
- 多个复选框中的一个应始终保持未选中状态
- 复选框上的点击捕捉事件
- 自定义样式的复选框-我的JavaScript逻辑问题(一个else分支没有被击中)
- 我如何从使用复选框模型的ExtJS网格中获得选定的记录