0

У меня есть наблюдаемый массив, содержащий отображенные данные Json. Данные уже отсортированы по «Производительности».Добавить значение наблюдаемого знака в значение observablearray

Что мне нужно сделать, это добавить ранжирование в массив, чтобы мой foreach выдавал нумерованный ранг. До сих пор я использовал $ index, который отлично работает, пока я не использую расширители сортировки и пейджинга, которые меняют индекс массива. Правильно ли я думаю, что лучшим подходом было бы добавить каждое значение индекса в массив?

Что-то подсказывает мне, что это должно быть довольно просто, но мне еще предстоит найти правильный подход.

viewModel.integerlists = ko.observableArray([]); 

function IntegerLists(data) { 
    this.IntegerListID = data.IntegerListID; 
    this.Performance = data.Performance; 
    this.Direction = data.Direction; 
    this.Integers = ko.observableArray(data.Integers); 
} 

$.getJSON("/Home/GetIntegerLists", function (allData) { 
    var mappedIntegers = $.map(allData, function (item) { return new IntegerLists(item) }); 
    viewModel.integerlists(mappedIntegers); 
}); 
+0

У меня была удача с расширением 'indexed', которое подписывается на наблюдаемый массив и проходит один проход путем обновления индекса на каждом из них. Вторая часть этого ответа: http://stackoverflow.com/questions/12229578/knockoutjs-access-index-of-item-in-array-from-within-the-javascript-template/12230148#12230148 –

+0

Спасибо RP - это интересно, но на самом деле не решает мою проблему. http://jsfiddle.net/zGmcg/26/ Если вы нажмете ссылку «оценка», то порядок подсчета будет переключен, но индекс останется таким же, как и должен. Мне не обязательно нужен индекс, мне просто нужен способ ранжировать членов массива на основе оценки. – user1405195

ответ

0

Если вы используете нумерацию страниц, то простое решение было бы вспомнить, какой странице вы находитесь и просто показать (стр-1) * (number_of_items_per_page) + $ индекс.

Если вы используете фильтрацию, то на стороне клиента вы ничего не можете сделать, потому что вы не получите обратно элементы, которые отфильтрованы, если вы не сохраните все данные на клиенте, а затем отфильтровыте их, что, на мой взгляд , Плохо. В случае, если вы идете на сервер для передачи данных, все, что я могу видеть, делать это получить все элементы из базы данных заказанной производительности, то вы используете расширенный класс:

public class ExtendedMyClass 
{ 
    public MyClass theObject{get;set;} 
    public int rank{get;set;} 
} 

и вернуть его в этом роде. Таким образом, ваш сервер будет иметь самые последние и самые точные данные, обрабатывать его довольно быстро и возвращать вам только то, что вам нужно. Конечно, после добавления ранга вы должны обработать, как вы отфильтровали данные - какую страницу вы хотите и какие фильтры вы применяли.

С другой стороны, если у вас есть ВСЕ данные на клиенте, вы можете просто перебрать его и динамически добавить ранг. Вы написали, что они отсортированы, поэтому следующий код должен сделать:

var counter = 1; 
mappedIntegers.forEach(function (singleInteger){ 
    singleInteger.rank = counter; 
    counter++; 
});