gpt4 book ai didi

javascript - 如何使用 Knockout 处理分页

转载 作者:搜寻专家 更新时间:2023-10-30 20:31:04 26 4
gpt4 key购买 nike

我有一个设置为绑定(bind)到 observeableArray 的 div,但我只想在任何给定时间显示该 observeableArray 中最多 50 个项目。我想通过页面上的上一个和下一个按钮以及索引进行分页来处理此问题,以允许用户循环浏览集合中项目的页面。
我知道我可以使用 computedObservable 和自定义数据绑定(bind),但我不确定该怎么做(我仍然是 Knockout 新手)。
谁能指出我正确的方向?

这是我的代码(JS 在 TypeScript 中):

<div class="container-fluid">
<div class="row-fluid">
<div class="span12">
<%=
if params[:q]
render 'active_search.html.erb'
else
render 'passive_search.html.erb'
end
%>
<%= form_tag("/search", method: "get", :class => "form-search form-inline") do %>
<%= label_tag(:q, "Search for:") %>
<%= text_field_tag(:q, nil, class:"input-medium search-query") %>
<%= submit_tag("Search", :class=>"btn") %>
<% end %>

<div class="media" data-bind="foreach: tweetsArray">
<%= image_tag('twitter-icon.svg', :class=>"tweet_img", :style=>"display:inline;") %>
<div class="media-body" style="display:inline;">
<h4 class="media-heading" data-bind="text: user.screen_name" style="display:inline;"></h4>
<span data-bind="text:text" style="display:inline;"></span> <br />
<span data-bind="text:'Created at '+created_at"></span> <br />
</div>
</div>

<div class="pagination pagination-centered">
<ul>
<li>
<a href="#">Prev</a>
</li>
<li>
<a href="#">1</a>
</li>
<li>
<a href="#">Next</a>
</li>
</ul>
</div>

</div>
</div>
</div>

<script>
var viewModel = new twitterResearch.TweetViewModel();
ko.applyBindings(viewModel);

//TODO: notes to self, use custom binding for pagination along with a computed observable to determine where at in the list you are

//document.onReady callback function
$(function() {
$.getJSON('twitter', {}, function(data) {
viewModel.pushTweet(data);
console.log(data.user);
});
});
</script>

declare var $: any;
declare var ko: any;

module twitterResearch {
class Tweet {
text: string;
created_at: string;
coordinates: string;
user: string;
entities: string;
id: number;
id_str: string;

constructor(_text: string, _created_at: string, _coordinates: any, _user: any,
_entities: any, _id_str: string, _id: number){

this.text = _text;
this.created_at = _created_at;
this.coordinates = _coordinates;
this.user = _user;
this.entities = _entities;
this.id_str = _id_str;
this.id = _id;
}
}

export class TweetViewModel{

tweetsArray: any;
constructor()
{
this.tweetsArray = ko.observableArray([]);
}

//tweet is going to be the JSON tweet we return
//from the server
pushTweet(tweet)
{
var _tweet = new Tweet(tweet.text, tweet.created_at, tweet.coordinates,
tweet.user, tweet.entities, tweet.id_str, tweet.id);
this.tweetsArray.push(_tweet);
this.tweetsArray.valueHasMutated();
}
}
}

最佳答案

Knockout 的分页非常简单。我个人会这样实现:

  • 拥有一个包含所有元素的 observableArray
  • 有一个包含当前页面的可观察对象(初始化为 0)
  • 有一个声明每页元素数量的变量
  • 有一个返回页数的计算,该页数是根据每页的元素数和元素总数计算得出的。
  • 最后,添加一个对包含所有元素的数组进行切片的计算。

鉴于此,您现在可以添加一个函数来递增(下一个)或递减(上一个)当前页面。

这是一个简单的例子:

var Model = function() {
var self = this;
this.all = ko.observableArray([]);
this.pageNumber = ko.observable(0);
this.nbPerPage = 25;
this.totalPages = ko.computed(function() {
var div = Math.floor(self.all().length / self.nbPerPage);
div += self.all().length % self.nbPerPage > 0 ? 1 : 0;
return div - 1;
});

this.paginated = ko.computed(function() {
var first = self.pageNumber() * self.nbPerPage;
return self.all.slice(first, first + self.nbPerPage);
});

this.hasPrevious = ko.computed(function() {
return self.pageNumber() !== 0;
});

this.hasNext = ko.computed(function() {
return self.pageNumber() !== self.totalPages();
});

this.next = function() {
if(self.pageNumber() < self.totalPages()) {
self.pageNumber(self.pageNumber() + 1);
}
}

this.previous = function() {
if(self.pageNumber() != 0) {
self.pageNumber(self.pageNumber() - 1);
}
}
}

您将在此处找到一个简单而完整的示例:http://jsfiddle.net/LAbCv/ (可能有点问题,但想法就在那里)。

关于javascript - 如何使用 Knockout 处理分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17668491/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com