【问题标题】:Using Slice With Array Created By Knockout's Mapping Plugin将切片与由 Knockout 的映射插件创建的数组一起使用
【发布时间】:2012-03-18 12:57:24
【问题描述】:

我整天都在为此苦苦挣扎,我不确定我错过了什么。我有一个使用 Knockout 创建的工作网格。我正在尝试将网格转换为使用映射插件,但它会破坏我的分页。如何使用带有映射插件的切片函数来返回我的数组的子集?我错过了什么?

var grid = {};
grid.Model = function (jsondata) {
 var viewModel = {
  items: ko.observableArray()
 };

 $.getJSON('/api/test/items', function (data) {
  viewModel.items= ko.mapping.fromJS(data);
  ko.applyBindings(viewModel)
 });

 viewModel.itemsOnCurrentPage = ko.computed(function () {
  return viewModel.items.slice(1, 10);
 }, viewModel);    
};

我正在尝试绑定到 itemsOnCurrentPage (foreach: itemsonCurrentPage)。直接绑定到项目工作正常。当我在客户端手动构建我的阵列时,这很有效。现在我通过 jQuery 获取数据并使用映射插件。我无法弄清楚我错过了什么。任何帮助将不胜感激。

【问题讨论】:

  • 你能连接一个 JSFiddle 来演示吗?

标签: javascript knockout.js knockout-mapping-plugin


【解决方案1】:

您的问题是 itemsOnCurrentPage 计算的 observable 与您的原始 observableArray 绑定。当您执行viewModel.items = ko.mapping.fromJS(data) 时,您将viewModel.items 设置为一个新的observableArray(itemsOnCurrentPage 不受约束)。

您可以改为:ko.mapping.fromJS(data, {}, viewModel.items) 来更新现有的 observableArray。

【讨论】:

  • 谢谢。这就说得通了。我明白我做错了什么。现在我需要想出一个解决方案。我不想更新 viewModel.items。我只想显示 viewModel.items 的“切片”。
  • 你肯定仍然可以使用itemsOnCurrentPage。您只想在 AJAX 请求返回时更新现有的 observableArray。
【解决方案2】:

RP 是正确的。

这是一个显示你在做什么的 JSFiddle:

http://jsfiddle.net/jearles/P99zy/

这是一个有效的更新:

http://jsfiddle.net/jearles/P99zy/2/

唯一的区别是我加载表格项的方式。

【讨论】:

    猜你喜欢
    • 2014-03-06
    • 2017-02-20
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 2013-09-27
    • 2015-04-18
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多