Javascript 如何防止敲除覆盖我的初始复选框值?
我有一个表单,通常通过浏览器加载,并使用Laravel填充,但使用Knockout.js和AJAX页面更新服务器:Javascript 如何防止敲除覆盖我的初始复选框值?,javascript,forms,checkbox,knockout.js,Javascript,Forms,Checkbox,Knockout.js,我有一个表单,通常通过浏览器加载,并使用Laravel填充,但使用Knockout.js和AJAX页面更新服务器: {{ Form::checkbox('launch_time_change', 'launch_time_change', true, array('data-bind' => checked: emailNotifications.launch_time_change')) }} 这里的第三个参数表示页面加载时复选框的状态,如您所见,它是选中的 但是,我希望随后将此值发
{{ Form::checkbox('launch_time_change', 'launch_time_change', true, array('data-bind' => checked: emailNotifications.launch_time_change')) }}
这里的第三个参数表示页面加载时复选框的状态,如您所见,它是选中的
但是,我希望随后将此值发送到Knockout,这样就可以在服务器上更新复选框,而无需重新加载页面。这需要将复选框值存储在ko.observable()
中,但每当我尝试将checked
绑定应用到我的复选框字段时,默认状态都会被覆盖
在上述情况下,当敲除初始化ViewModel中的观察对象时,最初在页面加载时选中的复选框将变为未选中。不幸的是,这是一个问题:
KO将元素的选中状态设置为与参数值匹配。任何以前选中的状态都将被覆盖
我怎样才能阻止这种事情发生 考虑到我的应用程序主要基于Laravel,我选择了一条完全不同的路线 我决定使用创建一个
Javascript
facade,在这里我可以将Javascript变量放到我的视图中,如下所示:
JavaScript::put([
'emailSubscriptions' => someValue
]);
这比全局范围内的任何地方都更容易访问,在窗口
对象所附加的命名空间变量中:
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请求 考虑到我的应用程序主要基于Laravel,我选择了一条完全不同的路线 我决定使用创建一个
Javascript
facade,在这里我可以将Javascript变量放到我的视图中,如下所示:
JavaScript::put([
'emailSubscriptions' => someValue
]);
这比全局范围内的任何地方都更容易访问,在窗口
对象所附加的命名空间变量中:
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的替代方法是创建一个新的
值
绑定,该绑定不会覆盖输入值
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>
登录名:
密码:
var viewModel={
用户名:ko.observable(),
userPassword:ko.observable(),
};
使用Knockout的替代方法是创建一个新的值
绑定,该绑定不会覆盖输入值
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>
登录名:
密码:
var viewModel={
用户名:ko.observable(),
userPassword:ko.observable(),
};
您对淘汰视图模型有什么控制?你不能只正确初始化可观察的对象吗?如果你在构建页面的过程中不能直接正确设置可观察的对象,你至少可以运行一些额外的JS代码,在调用applyBindings
?@JamesThorpe,complete control,但是我也不愿意单独请求AJAX下载数据。我可以在ApplyBinding之前初始化Observable,但我以前从未这样做过,因此我不知道该如何工作。将复选框值传递给视图模型构造函数,并将其设置为Observable您对淘汰视图模型有何控制?你不能只正确初始化可观察的对象吗?如果你在构建页面的过程中不能直接正确设置可观察的对象,你至少可以运行一些额外的JS代码,在调用applyBindings
?@JamesThorpe,complete control,但是我也不愿意单独请求AJAX下载数据。我可以在ApplyBinding之前初始化observable,但我以前从未这样做过,因此我不知道该如何工作。将复选框值传递给视图模型构造函数并将其设置为observable