Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js 取消复选框更改事件发送旧值_Knockout.js_Knockout 2.0 - Fatal编程技术网

Knockout.js 取消复选框更改事件发送旧值

Knockout.js 取消复选框更改事件发送旧值,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我有一个问题,淘汰“检查”绑定。复选框处的“更改”事件似乎在更新之前返回旧值(因此,如果未选中,则返回false)。我认为我不能订阅这个值,因为我在对象中有它 变量类别=函数(Id、名称、顺序、已打开){ 这个.Id=Id; this.Name=Name; 这个。顺序=顺序; this.ShowOpened=ShowOpened; this.IsUpdated=ko.可观察(假); this.OldOrder=订单; this.OldShowOpened=ShowOpened; }; var

我有一个问题,淘汰“检查”绑定。复选框处的“更改”事件似乎在更新之前返回旧值(因此,如果未选中,则返回false)。我认为我不能订阅这个值,因为我在对象中有它


变量类别=函数(Id、名称、顺序、已打开){
这个.Id=Id;
this.Name=Name;
这个。顺序=顺序;
this.ShowOpened=ShowOpened;
this.IsUpdated=ko.可观察(假);
this.OldOrder=订单;
this.OldShowOpened=ShowOpened;
};
var ViewModel={
类别:ko.observableArray([]),
类别更改:功能(P类别){
if(pCategory.Order!=pCategory.OldOrder | | pCategory.ShowOpened!=pCategory.OldShowOpened)
pCategory.IsUpdated(true);
其他的
pCategory.IsUpdated(false);
}
};
应用绑定(视图模型);

所以在这个例子中,我展示了一个打开的复选框,它可以触发CategoryChange方法,该方法将更改对象内部的变量(我需要稍后知道更新了哪个对象)。但当更改复选框时,它总是发送旧值、触发方法,然后更改值。有没有办法解决这个问题?

尝试使用
subscribe
而不是事件绑定。现在应该可以了

<table>
    <tbody data-bind="foreach: Categories">
        <tr>
            <td><input type="checkbox" data-bind="checked: ShowOpened" /></td>
        </tr>
    </tbody>
<table>

var Category = function (Id, Name, Order, ShowOpened) {
    this.Id = Id;
    this.Name = Name;
    this.Order = Order;
    this.ShowOpened = ko.observable(ShowOpened);
    this.IsUpdated = false;

    this.OldOrder = Order;
    this.OldShowOpened = ShowOpened;

    this.ShowOpened.subscribe(function (newShowOpened) {
        if(this.Order != this.OldOrder || this.ShowOpened() != this.OldShowOpened)
            this.IsUpdated = true;
        else
            this.IsUpdated = false;
    }, this);
};
var ViewModel = {
    Categories: ko.observableArray([])
};
ko.applyBindings(ViewModel);

既然你坚持认为缺少
ko.observables
不是问题,我就仔细研究了一下。看来你是对的!
change
事件在设置实际值之前触发。恐怕我不知道原因

但有一种简单的方法可以解决这个问题:只需将
更改
事件更改为
单击
事件:

<input type="checkbox" data-bind="checked: ShowOpened, click: $root.CategoryChange" />

我也有这个问题,但是我不能使用订阅解决方案,因为我已经用ajax请求订阅了同一个字段,该请求可以重置值。当您更改代码时,代码将保持在循环中。因此,我添加了以下解决方法(虽然很难看,但很有效)

然后,在听变化的时候,我会听变化后的事件

<div data-bind="foreach: answerList">
    <input type="checkbox" data-bind="event: { afterChange: $root.sendSelectedAnswer($data) }"/>
</div>


我知道这不是最好的解决办法,但就我而言,我别无选择

你的代码有问题。
ShowOpened
IsUpdated
都不是ko.observables(这可能就是为什么总是得到旧值的原因)。这段代码如何工作
CategoryChange
应该抛出一个异常。@奇怪的是,你是wright,我最初创建这篇文章时犯了一个错误。但您指出的错误仍然不是问题所在。Oi,仍然缺少以下内容:
this.showopen=ko.observable(ShowOpened)和此:
pCategory.ShowOpened()
。我必须说,你在写这篇文章的时候犯了很多错误……太好了,点击事件有效。我一开始就试过了,只是忘了返回true,而checkbox从未被选中/取消选中。谢谢。我也有同样的问题,IE没有识别
change
事件。Grr.工作完美!谢谢“return true;”是使其正常工作的关键!很好,即使我按下空格键并且复选框有焦点,点击事件也会被触发。在阅读此答案之前,我使用了两个复选框,因为我没有返回true。谢谢你的好办法。
this.ShowOpened = ko.observable(ShowOpened);
this.ShowOpened.subscribe(function(newValue) {
    /* Do something when ShowOpened changes.
       newValue variable holds the new value, obviously. :) */
});
$("input[type='radio'], input[type='checkbox']", element).on("change", function (e, data) {
    setTimeout(function () {
        $(this).trigger("afterChange", data);
    }.bind(this), 10);
}); 
<div data-bind="foreach: answerList">
    <input type="checkbox" data-bind="event: { afterChange: $root.sendSelectedAnswer($data) }"/>
</div>