【问题标题】:Iterating through a list of users and pushing to an array in knockout遍历用户列表并在淘汰赛中推送到数组
【发布时间】:2013-04-13 03:56:35
【问题描述】:

我有一个返回所有用户列表的脚本。我想要:

  • 根据返回的数据设置 viewModel 的 totalUsers 和页面属性。
  • 遍历用户列表并将最后一个用户对象推入 observableArry
  • push() 方法将用户添加到已加载和显示的用户中

目的 我实际上想统计所有用户,因为我将在一个页面加载 20 个用户,当我到达页面底部时,我会检查是否还有更多用户要加载,然后再加载它们。这样,如果我有 400 个用户 - 他们不会一次全部加载并占用时间。

剔除 JS 文件

$.views.Roster.RosterViewModel = function (data) {
    var self = this;
    self.RosterUsers = ko.observableArray([]);
    _rosterUsers = self.RosterUsers;
    self.currentPage = ko.observable(1);
    self.toDisplay = ko.observable(20);
    self.filteredRoster = ko.computed(function(){
        var init = (self.currentPage()-1)* self.toDisplay(),
            filteredList = [],
            rosterLength = self.RosterUsers().length,
            displayLimit = self.toDisplay();
        if(rosterLength == 0)
            return[];
        for(var i = init; i<(displayLimit + init) - 1 && i<rosterLength; i++)
        {
            filteredList.push(self.RosterUsers()[i]);
        }
        return filteredList;
    }),
    totalRoster = ko.computed(function () {
        return self.RosterUsers().length;
    }),
    changePage = function (data) {
        currentPage(data);
    },
    next = function () {
        if ((self.currentPage() * self.toDisplay()) > self.RosterUsers().length)
            return;

        self.currentPage(self.currentPage() + 1);
    },
    prev = function () {
        if (self.currentPage() === 1)
            return;

        self.currentPage(self.currentPage() - 1);
    },

    $.views.Roster.RosterViewModel.AddUsers(data);
};

HTML 查看页面

<script  type="text/html" id ="grid">

    <section id="rosterImages" style=" float:left">
    <section id="users">
        <div id="nameImage">
            <figure id="content">
                <img width="158" height="158" alt="Gravatar" data-bind="attr:{src: GravatarUrl}"/>
                <figcaption>
                    <a title="Email" id="emailIcon" class="icon-envelope icon-white" data-bind="attr:{'href':'mailto:' + Email()}"></a>
                    <a title="Profile" id="profileIcon" class="icon-user icon-white"></a>
                </figcaption>
            </figure>
            <p data-bind="text:Name"></p>
            </div>
        </section>
    </section>
</script>

<ul>
        <li><a href="#" data-bind="click: prev">Prev</a></li>
          <!-- ko foreach: ko.utils.range(1, totalRoster()/toDisplay() + 1) -->
          <li><a href="#" data-bind="text: $data, click: $parent.changePage"></a></li>
          <!-- /ko -->
        <li><a href="#" data-bind="click: next">Next</a></li>
      </ul>

更新:滚动脚本

$(window).scroll(function () {
        if ($(window).scrollTop() == $(document).height() - $(window).height()) {
            if (parseInt($.views.Roster.RosterViewModel.currentPage(), "10") * 20 < parseInt($.views.Roster.RosterViewModel.totalRoster(), "10")) {
                $.views.Roster.RosterViewModel.next();
            }
        }
    });

我怎样才能用我已经拥有的东西来添加这些东西?提前感谢您的帮助。

【问题讨论】:

  • 您是否打算在客户端分页数据?我的意思是,您是否打算让所有用户在客户端设置寻呼机?或者您的服务器是否正在获取您所在页面的数据等?
  • @sujeshArukil 是在客户端 - 这是开始的过程,因为我将添加一个滚动功能,该功能将在下一批用户滚动时加载,并且数组中仍有用户。
  • 也许我从未见过这个。 ajax 请求中的“限制”选项。它是什么?我真的找不到任何文档。
  • @sujeshArukil 我在某人的教程中看到了它:strathweb.com/2012/03/…
  • 看起来不错。本教程将其传递到数据对象中,而不是作为 $.ajax 自身的限制选项。如果您说服务器正在返回所有记录并且不关心页面和页面大小,对吗?在这种情况下,您的 ajax 将返回所有数据,您将计算附加到模型以获取计数。

标签: javascript knockout.js knockout-2.0


【解决方案1】:

给你。我模仿了小提琴的 getRoster ajax 调用。在您的情况下,您将进行“GET”调用而不是“POST”。

http://jsfiddle.net/sujesharukil/z8vpx/4/

rosterArray是主要的observableArray,它将存储来自服务器的整个列表,filteredRoster将根据currentPage从rosterArray中获取数据,toDisplay存储限制,currentPage跟踪当前页面,计算totalRoster返回总元素在数组中

var rosterArray = ko.observableArray(),
    currentPage = ko.observable(1),
    toDisplay = ko.observable(20),
    filteredRoster = ko.computed(function(){
        var init = (currentPage() - 1) * toDisplay(),
            filteredList = [],
            rosterLength = rosterArray().length,
            displayLimit = toDisplay();

        if(rosterLength === 0)
            return [];

        for(var i = init; i < (displayLimit + init) - 1 && i < rosterLength; i++){
            filteredList.push(rosterArray()[i]);
        }

        return filteredList;
    }),
    totalRoster = ko.computed(function(){
        return rosterArray().length;
    }),
    changePage = function(data){
        currentPage(data);
    },
    next = function(){
        if((currentPage() * toDisplay()) > rosterArray().length)
            return;

        currentPage(currentPage() + 1);
    },
    prev = function(){
        if(currentPage() === 1)
            return;

        currentPage(currentPage() - 1);
    };

希望对您有所帮助。

-苏杰

【讨论】:

  • 感谢您抽出宝贵时间帮助我,但我只想弄清楚一些事情。请原谅我缺乏这方面的知识——这是我第一次体验淘汰赛。所以我只是复制了您的代码并将其放入了我的 knockoutjs 文件(我最初发布的代码)中,然后我将您的 html 从 jsfiddle 复制到了我的 html 中,这样我就可以得到一个想法,但是通过添加的 html,我只能让一个用户显示带有prevnext 按钮的页面,其中的编号为空。我会更新我原来的帖子。
  • 你用的是什么浏览器?
  • 转到开发工具并告诉我您在控制台中看到的错误。并且您是否用小提琴中的代码替换了您拥有的整个代码?您是否删除了我正在进行的 ajax 调用?
  • 有:Uncaught Error: Unable to parse bindings. Message: ReferenceError: prev is not defined; Bindings value: click: prev 我没有替换整个 html,因为我的视图放置在模板中,因为我有一个切换按钮,可以在两个模板之间切换 - 这个(网格视图)和一个列表视图
  • 对于您上面的代码 - 它应该位于我拥有的 js 文件中的特定位置吗?我认为我以错误的方式将您的代码集成到我的代码中
猜你喜欢
  • 2017-11-10
  • 2017-09-19
  • 1970-01-01
  • 2013-04-10
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多