Javascript 如何防止敲除覆盖我的初始复选框值?

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')) }} 这里的第三个参数表示页面加载时复选框的状态,如您所见,它是选中的 但是,我希望随后将此值发

我有一个表单,通常通过浏览器加载,并使用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
绑定应用到我的复选框字段时,默认状态都会被覆盖

在上述情况下,当敲除初始化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