我有一个表格,它通常通过浏览器加载并填充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中的observable时,最初在页面加载时选择的复选框将被取消选中。这是expected behaviour,遗憾的是:
KO设置元素的检查状态以匹配您的参数值。任何先前检查的状态都将被覆盖。
我怎样才能阻止这种情况发生?
答案 0 :(得分:0)
好吧,考虑到我的申请主要是以Laravel为主,我选择了完全不同的路线。
我决定使用Jeffrey Way's laracasts/utilities
repo创建一个Javascript
外观,我可以将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请求。