2

IM特林在observableArray 2项之间替换淘汰赛,但什么是错的..交换2个observableArray项目 - 淘汰赛

后更换的物品,我会改变并发送displayOrder属性(在ITMEMS )服务器(或者我应该采取这个其他方式)

 ReplaceBetweenTwoitemsInArray: function() { 
      console.log("ranking down msg"); 
      var currentItemindex = viewModel.myobservableArray.indexOf(this); 
      var nextItemIndex = currentItemindex + 1; 
      viewModel.myobservableArray .replace(
       viewModel.myobservableArray()[nextItemIndex], 
       viewModel.myobservableArray()[currentItemindex] 
      ); 

     } 

只有第一项改变为第二项,但第二项犯规成为第一个

+1

什么是 “东西”,也就是错误? – Bergi

+0

我不确定viewModel.messages是什么,但调用它(使用“()”)似乎是奇怪的,因为它看起来像一个数组或字符串。 – Bergi

+0

'替换'不做交换。你为什么使用两个数组('myobservableArray'和'messages')?两个阵列中的顺序是不同的? –

回答

2

您可以使用一个临时变量:

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] 
+0

非常干净,简单。但是您需要告诉knockout observableArray的值已经手动更改: 'arr.valueHasMutated()' http://stackoverflow.com/questions/9519333/manually-get-knockout-to-re-evaluate-a- dependantobservable#9519870 – con

3

与保利的答案类似,但也会触发更新观测值,可能是DRYer。

http://jsfiddle.net/marrok/ckMJE/101/

<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>​ 

的Javascript:

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);​ 
+0

对我来说是否有诀窍!唯一需要注意的是,如果您使用DataTable将数组呈现为表格(特别是使用绑定处理程序),而不是按照此处的示例进行直接数据绑定,则无法工作。我删除了DataTable,现在这个代码工作得很好。 –

0

你可以使用直接在observableArray这样的删除和拼接功能:

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