Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.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
Javascript Knockoutjs:同时使用click和checked绑定时绑定求值的顺序_Javascript_Binding_Mvvm_Knockout.js - Fatal编程技术网

Javascript Knockoutjs:同时使用click和checked绑定时绑定求值的顺序

Javascript Knockoutjs:同时使用click和checked绑定时绑定求值的顺序,javascript,binding,mvvm,knockout.js,Javascript,Binding,Mvvm,Knockout.js,我不知道如何访问与单击绑定关联的方法中已通过选中绑定更新的值 似乎选中的绑定在单击绑定后进行计算,因为在单击绑定方法/处理程序中,我无法访问计算的属性值,这取决于与选中的绑定同步的数组 单个复选框的模板: <script id="singleFilterTemplate" type="text/html"> <li> <input type="checkbox" data-bind="attr: { value: id },

我不知道如何访问与
单击
绑定关联的方法中已通过
选中
绑定更新的值

似乎
选中的
绑定在
单击
绑定后进行计算,因为在
单击
绑定方法/处理程序中,我无法访问
计算的
属性值,这取决于与
选中的
绑定同步的数组

单个复选框的模板:

<script id="singleFilterTemplate" type="text/html">
    <li>
        <input type="checkbox" data-bind="attr: { value: id }, 
                                          click: $root.testMethod,
                                          checked: $parent.selectedFilterIds">
    </li>
</script>
  • 选中:$parent.selectedFilterIds
    :每次选中/取消选中复选框时,-
    TopLevelViewModel中的相应项。selectedFilterIds
    数组将更新
  • click:$root.testMethod
    :单击复选框时,我试图获取所有复选框的当前状态,为此,我引入了计算属性
    aggregatedSelectedIds
    ,该属性运行良好,表示所有
    GroupViewModel.selectedFilterIds
    值的聚合状态,基本上,它将所有
    selectedFilterIds
    属性中的元数据聚合为一个值,在
    testMethod()
    中,我只是调用
    警报(topLevelViewModel.aggregatedSelectedIds())
    ,以确保此属性表示当前选定过滤器的列表

因此,每次通过
单击
绑定调用
testMethod()
,我都会看到过滤器的先前状态(值,由
aggregatedselectedds
计算)。那么,在单击绑定之前,是否有任何方法强制/推送/评估
已选中的
绑定?我尝试了
event
绑定,但得到了相同的结果。也许我做得不对,错过了一些明显的东西?

通常情况下,方法是按照您希望的顺序绑定和执行的。。把它们捆起来。。看起来您正在绑定,请先单击。不确定knockoutjs如何从数据绑定属性处理这个问题

比如说

$(this).click(function () { alert(1);})
    .click(function() {alert(2);});

// alert(1) is first 
我意识到这就是jquery,但纯js中的事件绑定也是如此


要做到这一点,最好的方法是遵守或承诺,但我不知道在knockoutjs中是如何做到的:(

由于选中复选框将基本上同时触发选中事件和单击事件,因此浏览器决定首先触发其中一个处理程序,因此一个简单的修复方法是在单击处理程序中使用超时

类似于
setTimeout(function(){stuff},1)
的东西应该可以工作

将其放入click处理程序将“跳出”处理程序,让选中的处理程序启动并执行,然后它将返回超时回调中的代码(如果选中的处理程序的速度足够快,可以在这之前完成,则等待1ms,对此我表示怀疑)


即使选中的处理程序首先在其他浏览器中启动,此解决方案仍能正常工作。

您可以通过执行以下操作订阅对SelectedFilterID的更改

this.selectedFilterIds  = ko.observable();
this.selectedFilterIds.subscribe(function (value) {
    //Code from your click method goes here
});

更改
click
chekced
绑定的顺序是一个技巧,但会弄乱复选框的状态,因此我在绑定到
click
method中得到了更新状态。bucheck框仍然显示以前的状态感谢这个想法,但只要我有其他更多本机选项,我就会避免任何解决方法。我发现了显式sub使用
subscribe()进行脚本编写
这是一个非常有趣的解决方案,因为我可以完全控制我的工作。顺便说一句,你认为在不同的浏览器中,事件的执行顺序可能会不同吗?对我来说很奇怪,但我不擅长跨浏览器开发,所以谁知道呢?我不记得任何细节,但如果发生什么事情,我不会感到惊讶(比如说旧版本的IE;))关于事件的顺序,我想这是一个通用的解决方案。我不熟悉javascript中的超时,你能稍微扩展一下你的例子吗?它非常简单。你只需要把你想要执行的代码放在我有
东西的地方即可。第二个参数
1
是您希望它等待的毫秒数。请参阅:尝试此操作后,它会对绑定集合执行一个技巧,以便在我的处理程序中可以看到更新的状态,但复选框会出错,因为它表示上一个状态(在我进行下一次选择之前,上次选中的复选框将保持未选中状态)。
this.selectedFilterIds  = ko.observable();
this.selectedFilterIds.subscribe(function (value) {
    //Code from your click method goes here
});