为什么sort给我随机排序(Knockout observable array)

时间:2016-05-20 18:36:02

标签: javascript arrays sorting knockout.js

我有一个包含数字的可观察数组。我想按价格按钮排序。这是我的viewmodel:

var ViewModel = function(model) {
        self.Numbers = ko.observableArray(model);
        self.SortArray = function() {

            InstanceViewModel.Numbers.sort(function (left, right) {
                return left.id == right.id ? 0 : (left.id < right.id ? -1 : 1) })
        }
    }

    var InstanceViewModel = new ViewModel([{"id":"1"},{"id":"2"},{"id":"3"},{"id":"4"}]);

    ko.applyBindings(InstanceViewModel);

这是我的HTML:

<input type="button" value="Sort" data-bind="click: SortArrayNum">
    <div data-bind="foreach: Numbers">
        <h1 data-bind="text: id"></h1>
    </div>

它没有正确排序这怎么可能?它还说:&#34; Uncaught TypeError:无法读取属性&#39; sort&#39;未定义&#34;。我上次让这个工作,它随机排序奇怪。我做错了什么人?

2 个答案:

答案 0 :(得分:2)

通过阅读http://knockoutjs.com/documentation/observableArrays.html正确的方法

myObservableArray.sort(function (left, right) { return left.lastName == right.lastName ? 0 : (left.lastName < right.lastName ? -1 : 1) })
因此,不应该

self.SortArray = function () { 
   return self.Numbers.sort(function (left, right) { return left.id == right.id ? 0 : (left.id < right.id ? -1 : 1) }) 
}

而不是

self.SortArray = function() {

            InstanceViewModel.Numbers.sort(function (left, right) {
                return left.id == right.id ? 0 : (left.id < right.id ? -1 : 1) })
        }

答案 1 :(得分:1)

<input type="button" value="Sort" data-bind="click: SortArray">

    <div data-bind="foreach: Numbers">
        <h1 data-bind="text: id"></h1>
    </div>


var ViewModel = function(model) {
        self.Numbers = ko.observableArray(model);
        self.SortArray = function() {

          self.Numbers.sort(function (left, right) {
                return left.id == right.id ? 0 : (left.id < right.id ? -1 : 1) })
        }
    }

    var InstanceViewModel = new ViewModel([{"id":"2"},{"id":"1"},{"id":"6"},{"id":"4"}]);

    ko.applyBindings(InstanceViewModel);

http://jsfiddle.net/93Z8N/239/

您将获得异常,因为您的函数名为SortArray而不是SortArrayNum