Как использовать KnockoutJS для добавления подкачки на стороне клиента в таблицу?

#javascript #jquery #knockout.js

#javascript #jquery #knockout.js

Вопрос:

Как я могу добавить подкачку с помощью KnockoutJS?

Мой текущий код:

 //assuming jsondata is a collection of data correctly passed into this function

myns.DisplayFields = function(jsondata) {
    console.debug(jsondata);
    window.viewModel = {
        fields: ko.observableArray(jsondata),
        sortByName: function() { //plus any custom functions I would like to perform
            this.items.sort(function(a, b) {
                return a.Name < b.Name ? -1 : 1;
            });
        },
    };

    ko.applyBindings(viewModel);
}
  

Мое мнение:

 <table>
  <tbody data-bind='template: "fieldTemplate"'></tbody>
</table>

<script type="text/html" id="fieldTemplate">
{{each fields}}
    <tr>
         <td> ${ FieldId }</td>
         <td>${ Type }</td>
         <td><b>${ Name }</b>: ${ Description }</td>
    </tr>
{{/each}}
</script>
  

Могу ли я использовать jQuery, jQuery UI или другую библиотеку?

Я видел на сайте KnockoutJS в качестве примера:

 myModel.gridViewModel = new ko.simpleGrid.viewModel({
    data: myModel.items,
    columns: [
        { headerText: "Item Name", rowText: "name" },
        { headerText: "Sales Count", rowText: "sales" },
        { headerText: "Price", rowText: function (item) { return "$"   item.price.toFixed(2) } }
    ],
    pageSize: 4
});
  

Однако, где я мог бы добавить размер страницы в свой код? Как выполняется этот pageSize внутри?

Ответ №1:

Основная идея заключается в том, что у вас есть зависимые наблюдаемые вычисляемые наблюдаемые, которые представляют строки на вашей текущей странице и привязывают к ней вашу таблицу. Вы бы разрезали весь массив, чтобы получить строки для страницы. Затем у вас есть кнопки / ссылки пейджера, которые управляют индексом страницы, что приводит к переоценке dependentObservable, в результате чего получаются текущие строки.

Основываясь на вашем коде, что-то вроде:

 var myns = {};
myns.DisplayFields = function(jsondata) {
    var viewModel = {
        fields: ko.observableArray(jsondata),
        sortByName: function() { //plus any custom functions I would like to perform
            this.items.sort(function(a, b) {
                return a.Name < b.Name ? -1 : 1;
            });
        },
        pageSize: ko.observable(10),
        pageIndex: ko.observable(0),
        previousPage: function() {
            this.pageIndex(this.pageIndex() - 1);
        },
        nextPage: function() {
            this.pageIndex(this.pageIndex()   1);
        }
    };

    viewModel.maxPageIndex = ko.dependentObservable(function() {
        return Math.ceil(this.fields().length / this.pageSize()) - 1;
    }, viewModel);

    viewModel.pagedRows = ko.dependentObservable(function() {
        var size = this.pageSize();
        var start = this.pageIndex() * size;
        return this.fields.slice(start, start   size);
    }, viewModel);

    ko.applyBindings(viewModel);
};
  

Итак, вы бы привязали свою таблицу к pagedRows .

Пример здесь:http://jsfiddle.net/rniemeyer/5Xr2X /

Комментарии:

1. Спасибо, я думаю, мне нужно разобраться knockout.js лучше, я подумал, что лучше всего начать с практического примера, чтобы сразу привыкнуть к этой библиотеке, ну что ж 🙂

2. Функция maxPageIndex неверна. Это должно быть: Math.ceil(this. поля ().длина / this.pageSize()) — 1;

3. Спасибо. Я вижу, где это не удается ранее. Обновленный ответ.

4. Не совсем обязательно, но вы можете рассмотреть возможность проверки предыдущей страницы и следующей страницы на соответствие ограничениям. Например: if( this.pageIndex() — 1 >= 0 ){ this.pageIndex(this.pageIndex() — 1); } Спасибо за отличный пример!

5. Я написал повторно используемый компонент, который обеспечивает то же самое здесь blog.greatrexpectations.com/2012/07/11 /…

Ответ №2:

Вы добились того, чего хотели?

Недавно я выложил на github пример хорошего пейджера, использующего knockout.

Смотрите https://github.com/remcoros/ko.pager для исходного кода и http://remcoros.github.com/ko.pager/example.html для рабочего примера.

Все вычисления и некоторые удобные свойства предоставляются классом ‘Pager’, который вы можете создавать и привязывать к нему. Пример рабочего шаблона прилагается.

Смотрите источник example.html для некоторых документов и использования.

Ответ №3:

Возможно https://github.com/addyosmani/backbone.paginator есть что-нибудь для вас? Со страницы Github:

Магистраль.Paginator — это набор независимых компонентов для разбиения коллекций данных на страницы с использованием Backbone.js . Он призван предоставить оба решения для облегчения разбивки запросов на страницы к серверу (например, API), а также разбивки на страницы отдельных загрузок данных, где мы можем захотеть дополнительно разбить коллекцию из N результатов на страницы M в представлении.

Комментарии:

1. проголосовал за. не смотрел bb paginator, но кажется жизнеспособным, если вы знаете, как записать glue в knockout.