Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 剔除可观测数组意外排序_Javascript_Arrays_Sorting_Knockout.js_Data Binding - Fatal编程技术网

Javascript 剔除可观测数组意外排序

Javascript 剔除可观测数组意外排序,javascript,arrays,sorting,knockout.js,data-binding,Javascript,Arrays,Sorting,Knockout.js,Data Binding,背景: 我目前正在开发一个使用Knockout的UI。我已经使用击倒有一段时间了,但这个问题一直困扰着我。我试图对一个称为Actions的可观察数组进行排序,并将其绑定到我创建的模板中的foreach。我通过创建一个调用Actions数组上的sort函数的computed来绑定 代码: self.Actions=ko.observearray([]); self.SortedActions=ko.computed(函数(){ 返回self.Actions() .排序(功能(a、b){ var a

背景: 我目前正在开发一个使用Knockout的UI。我已经使用击倒有一段时间了,但这个问题一直困扰着我。我试图对一个称为Actions的可观察数组进行排序,并将其绑定到我创建的模板中的foreach。我通过创建一个调用Actions数组上的sort函数的computed来绑定

代码:

self.Actions=ko.observearray([]);
self.SortedActions=ko.computed(函数(){
返回self.Actions()
.排序(功能(a、b){
var aoorder=编号(a.Order());
var bOrder=编号(b.Order());
返回订单
预期结果: 我试图让数组从1-n中对每个动作中可观察到的顺序进行排序。我已经知道没有重复的订单,所以这不是一个问题,我知道一切都是一个整数,从1开始,到n结束

实际结果: 当动作长度小于10个动作时,所有动作似乎都正常工作。然而,一旦超过10,订单就不会像我预期的那样出现。每次我加载它们时,它们都以相同的顺序出现,但是这种顺序是不正确的,似乎是随机的。(这意味着它似乎不是一个明显的模式排序。例如,按字母顺序排列)

如果有人知道为什么这不起作用,我将非常感激。我以前从未见过这种行为如此古怪,我完全被难住了。请让我知道如果你需要更多的细节。这是我的第一篇帖子,所以我可能把事情搞砸了

谢谢,
:)

当可观察到的内容发生类似的变化时,可以使用subscribe对初始数组进行排序

请注意,这将对每个更改进行排序,因此,如果您将一批添加直接添加到可观察对象,这将是非常浪费的。您应该添加到基础数组中,然后调用
valueHasMutated()

如果您最终这样做了,那么您也可以在需要时调用数组上的sort,这样会更清楚

var viewModel=function(){
var self=这个;
自我行动=ko.observearray([“一”、“二”、“三”);
self.Actions.subscribe(函数(){
控制台日志(“排序…”);
self.Actions().sort();
});
//触发器排序
自我行动推动(“零”);
self.addnew=函数(){
self.Actions.push(“新建”+self.Actions().length);
}
}
应用绑定(新的viewModel())


  • 添加新的
    两件事:
    排序
    作用于原始数组,因此也会导致对
    self.Actions
    进行排序。您应该使用
    返回边框-aoorder以获得正确的结果。是否尝试实现始终处于排序状态的数组?是的,我想要一个始终排序以显示的数组。这样,当我重新排序操作时,我所需要做的就是更改订单号。@MichaelBest这对我也不起作用。这给了我[8,1,7,14,12,11,10,9,2,13,6,5,4,3,15,16]的顺序,切换我的1和-1似乎解决了问题。我还想指出,这个列表有点递归,因此实际上需要做一些更改,但当前所有内容都按照预期工作,排序集为aoorderself.Actions = ko.observableArray([]);
    
    self.SortedActions = ko.computed(function() {
    return self.Actions()
        .sort(function (a, b) {
            var aOrder = Number(a.Order());
            var bOrder = Number(b.Order());
    
            return aOrder < bOrder ? 1 : -1;
        });
    });
    
    <div class="row" data-bind="template: { name: 'action-template', foreach: SortedActions }"></div>