<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">/**
 * Created by Satrong on 2014/8/3.
 * Knockoutjs åˆ†é¡µ
 */

/**
 *   dom {[object HTMLElement]} å…ƒç´&nbsp;å¯¹è±¡ï¼Œå¦‚ï¼šdocument.getElementById("foo")
 *   url {String} èŽ·å–æ•°æ®çš„åœ°å€ï¼Œè¿”å›žçš„æ•°æ®æ&nbsp;¼å¼ï¼š{total:'æ€»é¡µæ•°(Numberç±»åž‹)',list:'æ•°ç»„(Array)'}
 *   viewmodel {Function} æž„é€&nbsp;å‡½æ•°ï¼Œæ˜¾ç¤ºæ•°æ®çš„å±žæ€§åå¿…é¡»æ˜¯list,é€šè¿‡ new viewmodel().list([]) æ¥æ˜¾ç¤ºæ•°æ®åˆ—è¡¨
 */

var Page = function (dom, url, viewmodel) {
    var that = this;
    this.dom = dom;
    this.url = url;
    this.vm = viewmodel || function () { };
    this.PageHtml();
    this.GetData(function (data) {
        that.PageLink(data);
    });
}

Page.prototype.GetData = function (callback, p) {
    var data = {};
    data.pageSize = 20;
    data.pageNumber = 1;
    if (typeof p === "object") {
        $.extend(data, p);
    } else {
        data.pageNumber = p || 1;
    }
    $.ajax({
        url: this.url,
        cache: false,
        async: false,
        data: data,
        success: function (json) {
            callback(json);
        },
        error: function () {
            alert("èŽ·å–æ•°æ®å¤±è´¥");
        }
    });
}

Page.prototype.PageHtml = function () {
    var str = '&lt;div class="ko-grid-pageLinks"&gt;&lt;span class="page-inner" data-bind="foreach:pageList"&gt;'
		 + '&lt;a href="#" data-bind="html:$data,click:$root.pageTurn,css:$data===$root.current()?\'current\':\'\'"&gt;&lt;/a&gt;'
		 + '&lt;/span&gt;&lt;/div&gt;';
    $(this.dom).append(str);
}

Page.prototype.PageLink = function (data) {
    var that = this;
    var vm = new this.vm();
    vm.list &amp;&amp; vm.list(data.list);
    vm.pages = ko.observable(data.list.length === 0 ? 0 : Math.ceil(data.total / data.list.length));
    vm.current = ko.observable(1);
    vm.pageList = ko.observableArray(that.Range(vm.current(), vm.pages()));
    vm.options = {};
    vm.pageTurn = function ($data) {
        if (/^\d+$/.test($data) &amp;&amp; ($data &lt; 1 || $data &gt; vm.pages()))
            return;
        if ($data === "&amp;laquo;") {
            $data = vm.current() - 1;
        } else if ($data === "&amp;raquo;") {
            $data = vm.current() + 1;
        }
        if ($data &lt; 1 || $data &gt; vm.pages())
            return;
        that.GetData(function (data) {
            vm.list &amp;&amp; vm.list(data.list);
            vm.current($data);
            vm.pageList(that.Range($data, vm.pages()));
        }, $.extend(vm.options, { pageNumber: $data }));
    }
    vm.klass = function (type, current, pages) {
        if (/^\d+$/.test(type)) {
            return '';
        } else {
            if (current === 1 &amp;&amp; type === "&amp;laquo;") {
                return 'disabled';
            } else if (current === pages &amp;&amp; type === "&amp;raquo;") {
                return 'disabled';
            }
        }
    }
    this.ViewModel = vm;
    ko.applyBindings(vm, that.dom);
}

Page.prototype.Search = function (options) {
    var that = this;
    this.GetData(function (json) {
        that.ViewModel.list(json.list);
        that.ViewModel.options = options;
        that.ViewModel.current(1);
        that.ViewModel.pages(json.list.length === 0 ? 0 : Math.ceil(json.total / json.list.length));
        that.ViewModel.pageList(that.Range(1, that.ViewModel.pages()));
    }, options);
}

Page.prototype.Range = function (current, pages) {
    var start = 1;
    if (pages &lt; 5) {
        start = 1;
    } else if (current &lt; 3) {
        start = 1;
    } else if (current + 2 &gt; pages) {
        start = pages - 4;
    } else {
        start = current - 2;
    }
    var arr = ko.utils.range(start, start + 4 &gt; pages ? pages : start + 4);
    arr.unshift('&amp;laquo;');
    arr.push('&amp;raquo;');
    return arr.length &lt; 4 ? [] : arr;
}
</pre></body></html>