Javascript 敲除JS-修改observableArray中项目的属性

Javascript 敲除JS-修改observableArray中项目的属性,javascript,jquery,.net,asp.net-mvc,knockout.js,Javascript,Jquery,.net,Asp.net Mvc,Knockout.js,我试图更新显示为红色的数字,以反映当一个项目被重新定位时,每个项目在observableArray中的位置。您可以在此处查看我的当前代码: 它的行为不像我期望的那样。我觉得这是因为数组中的项目及其属性本身是不可观察的 但我不太确定如何让它起作用 ko.bindingHandlers.sortable.afterMove = function () { self.adjustOrder(); }; self.adjustOrder = function () { for (

我试图更新显示为红色的数字,以反映当一个项目被重新定位时,每个项目在observableArray中的位置。您可以在此处查看我的当前代码:

它的行为不像我期望的那样。我觉得这是因为数组中的项目及其属性本身是不可观察的

但我不太确定如何让它起作用

   ko.bindingHandlers.sortable.afterMove = function () {
    self.adjustOrder();
};

self.adjustOrder = function () {
    for (var i = 0, j = self.items().length; i < j; i++) {
        self.items()[i].sortOrder = i;
    };
};
ko.bindingHandlers.sortable.afterMove=函数(){
self.adjustOrder();
};
self.adjustOrder=功能(){
对于(var i=0,j=self.items().length;i
这一点在

关键点:observableArray跟踪阵列中的对象, 不是这些对象的状态

简单地将一个对象放入observableArray并不能使所有 那个物体的属性本身是可以观察到的。当然可以 如果你愿意的话,让这些属性可以被观察到,但这是一个问题 独立选择

因此,您需要使您的
sortOrder
properties
ko.observable()
(有一个名为的插件可以在这方面提供帮助),然后将
adjustOrder
更改为

self.adjustOrder = function () {
    for (var i = 0, j = self.items().length; i < j; i++) {
        self.items()[i].sortOrder(i);
    };
};
self.adjustOrder=功能(){
对于(var i=0,j=self.items().length;i
演示

旁注:但在您的情况下,
sortOrder
属性实际上不需要任何属性,因为
items
中的项目顺序就是排序顺序。因此,在绑定中,您可以只使用
$index
(属性)而不是
排序器


演示

这一点在

关键点:observableArray跟踪阵列中的对象, 不是这些对象的状态

简单地将一个对象放入observableArray并不能使所有 那个物体的属性本身是可以观察到的。当然可以 如果你愿意的话,让这些属性可以被观察到,但这是一个问题 独立选择

因此,您需要使您的
sortOrder
properties
ko.observable()
(有一个名为的插件可以在这方面提供帮助),然后将
adjustOrder
更改为

self.adjustOrder = function () {
    for (var i = 0, j = self.items().length; i < j; i++) {
        self.items()[i].sortOrder(i);
    };
};
self.adjustOrder=功能(){
对于(var i=0,j=self.items().length;i
演示

旁注:但在您的情况下,
sortOrder
属性实际上不需要任何属性,因为
items
中的项目顺序就是排序顺序。因此,在绑定中,您可以只使用
$index
(属性)而不是
排序器


演示

听起来是个不错的初始假设。通过使排序器可见,然后更新相同的可见来测试它。尽管如此,根据
可观察数组,将
排序器
作为一个计算的可观察数组可能更有意义。听起来像是一个很好的初始假设。通过使排序器可见,然后更新相同的可见来测试它。虽然,将
sortOrder
作为一个依赖于
items
可观察数组的计算可观察数组可能更有意义。感谢nemesv,但我真正的问题在于,在我的real app中,提供给可观察数组的数据是来自ajax调用的JSON数组。因此,我不能像在第一个演示中那样指定可观察的sortOrder属性。这就是映射插件的用途?是的,映射插件的目标就是支持这些用例。在您的示例中,只需将
ko.observableArray
替换为
ko.mapping.fromJS
,它就可以工作了:。因为
ko.mapping.fromJS
将常规JavaScript数组转换为可观察数组,并遍历每个项,将属性转换为
ko.obserable
对象。感谢nemesv,但我真正的问题在于,在我的真实应用程序中,提供给可观察数组的数据是来自ajax调用的JSON数组。因此,我不能像在第一个演示中那样指定可观察的sortOrder属性。这就是映射插件的用途?是的,映射插件的目标就是支持这些用例。在您的示例中,只需将
ko.observableArray
替换为
ko.mapping.fromJS
,它就可以工作了:。因为
ko.mapping.fromJS
将常规JavaScript数组转换为可观察数组,并遍历每个项,将属性转换为
ko.obsable
对象。