如何防止Knockout覆盖我的初始复选框值?

时间:2015-07-10 10:08:22

标签: 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')) }} 

此处的第三个参数表示页面加载时复选框的状态,如您所见,它已被检查。

但是,我想将此值发送到Knockout,以便可以在服务器上更新复选框,而无需重新加载页面。这需要将复选框值存储在ko.observable()中,但每当我尝试将checked绑定应用于我的复选框字段时,都会覆盖默认状态。

在上面的例子中,当Knockout初始化ViewModel中的observable时,最初在页面加载时选择的复选框将被取消选中。这是expected behaviour,遗憾的是:

  

KO设置元素的检查状态以匹配您的参数值。任何先前检查的状态都将被覆盖。

我怎样才能阻止这种情况发生?

1 个答案:

答案 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请求。