Javascript 在observableArray中交换2项-淘汰

Javascript 在observableArray中交换2项-淘汰,javascript,knockout.js,observablecollection,knockout-2.0,Javascript,Knockout.js,Observablecollection,Knockout 2.0,我想用淘汰赛来替换observableArray中的两个项目,但有点不对劲 在替换项目之后,我将更改displayOrder属性并将其发送到服务器(或者我应该采取其他方法) 只有第一项更改为第二项,但第二项未成为第一项您可以使用临时变量: var arr = ko.observableArray([0, 1]) // Should produce arr() = [0, 1] var tmp = arr()[0]; arr()[0] = arr()[1]; arr()[1] = tmp;

我想用淘汰赛来替换observableArray中的两个项目,但有点不对劲

在替换项目之后,我将更改displayOrder属性并将其发送到服务器(或者我应该采取其他方法)


只有第一项更改为第二项,但第二项未成为第一项

您可以使用临时变量:

var arr = ko.observableArray([0, 1])

// Should produce arr() = [0, 1]

var tmp = arr()[0];

arr()[0] = arr()[1];
arr()[1] = tmp;

// At this point, arr() is [1, 0]

与Paoli的回答类似,但也会触发对可观察对象的更新,这可能是一个问题


您可以直接在ObservalArray上使用移除和拼接功能,如下所示:

var arr=ko.observableArray(["x","y"]);
var index=arr.indexOf("y");
var tmp=arr()[index-1];
arr.remove(tmp);
arr.splice(index,0,tmp);

什么是错误的“某物”?我不确定viewModel.messages是什么,但调用它(使用“()”)似乎很奇怪,因为它看起来像是一个数组或字符串。
replace
不会进行交换。为什么要使用两个数组(
myobservableArray
消息
)?两个数组中的顺序是否不同?请参见“非常清晰和简单”。但是您需要告诉knockout ObservalArray的值已经手动更改:
arr.valueHasMutated()
帮我搞定了!唯一需要注意的是,如果您使用DataTables将数组呈现为表,特别是使用绑定处理程序,而不是按照这里的示例进行直接的数据绑定,那么它将不起作用。我删除了DataTable,现在这段代码运行得很好。
<ul data-bind="foreach: colors">
    <li><span data-bind="text:color"></span>
    </li>
</ul>
<br/>
<span>From:</span><input type="text" data-bind="value:from"/>
<br/>
<span>TO:</span><input type="text" data-bind="value:to"/>
<br/>
<button data-bind="click:swap">Swap It</button>​
var ViewModel = function() {
    this.self = this;
    self.from = ko.observable(0); // default
    self.to = ko.observable(1); // default
    self.colors = ko.observableArray([{
        color: 'red'},
    {
        color: 'green'},
    {
        color: 'pink'},
    {
        color: 'blue'},
    {
        color: 'yellow'}]);

    self.swap= function() {
        var iTo = parseInt(self.to());
        var iFrom = parseInt(self.from());
        var from = self.colors()[iFrom];
        var to = self.colors()[iTo];
        console.log("Before", self.colors().map(function(d){return d.color;} ), from, to, iFrom, iTo)
        self.colors()[iTo] = from;
        self.colors()[iFrom] = to;
        console.log("After ", self.colors().map(function(d){return d.color;} ), from, to, iFrom, iTo)
        self.colors.valueHasMutated()

    };
};
model = new ViewModel()
ko.applyBindings(model);​
var arr=ko.observableArray(["x","y"]);
var index=arr.indexOf("y");
var tmp=arr()[index-1];
arr.remove(tmp);
arr.splice(index,0,tmp);