为啥 ko.ObservableArray 中的替换值没有更新我的视图?

Posted

技术标签:

【中文标题】为啥 ko.ObservableArray 中的替换值没有更新我的视图?【英文标题】:Why are the replaced values in ko.ObservableArray not updating my view?为什么 ko.ObservableArray 中的替换值没有更新我的视图? 【发布时间】:2021-08-07 15:32:21 【问题描述】:

我正在尝试为一个简单的网上商店制作一个概览页面。客户端可以转到下一页,但这不会重新加载整个文档,它只会触发对下一组产品的获取。 我正在用淘汰赛填充元素列表。该网站加载了一个空的产品列表,并开始了初始提取。目前这是使用一个常量值完成的,但将来将取决于 URL。

获取完成后,ObservableArray 的值会更新,但视图不会改变。如果我在获取后绑定视图模型,那么它将相应地更新视图,但我认为这不是首选方法。

我认为问题在于我对图书馆惯例的理解。我希望有人能让我更清楚。

我的代码如下:

let OverviewModel = function() 
    let self = this;

    self.products = ko.observableArray([]);
;

let OverviewController = function(model) 
    let self = this;

    ko.applyBindings(model);
    console.log("Model is bound"); // Prints

    self.fetchProducts = function (amount, page) 
        let url = new URL("/webshop/products", window.location.href)
        url.searchParams.append("amount", amount)
        url.searchParams.append("page", page)
        $.getJSON(url, function (data) 
            console.log(model.products()); // Prints: []
            model.products.removeAll();
            ko.utils.arrayPushAll(model.products, data);
            model.products.valueHasMutated();
            console.log(model.products()) // Prints: [Object  title: Lorem, ... , ...]
        );
    ;
;

let model = new OverviewModel();
let controller = new OverviewController(model);
controller.fetchProducts(20, 0);

【问题讨论】:

这个问题 (***.com/questions/36618682/…) 可以帮助你。 【参考方案1】:

不太确定什么不适合您,请参阅这个 sn-p,其中一切都按预期工作。我已经删除了 fetchProducts 中的一些代码,因为这不是一个简单的淘汰更新应该如何进行。 (以及一些用于数据检索的虚假 api 承诺)

const getProducts = (amount, page) =>
    new Promise((resolve, reject) => 
    if (isNaN(Number(amount)) || isNaN(Number(page))) 
      reject(new Error('Products not found'));
     
    setTimeout(() => resolve(['foo', 'bar']), 500);
  );

let OverviewModel = function() 
  let self = this;

  self.products = ko.observableArray([]);
  
  self.products.subscribe(products => console.log(products));
;

let OverviewController = function(model) 
  let self = this;

  ko.applyBindings(model);
  console.log("Model is bound"); // Prints

  self.fetchProducts = (amount, page) => getProducts(amount, page).then(data =>     
    model.products(data);
  );
;

let model = new OverviewModel();
let controller = new OverviewController(model);
controller.fetchProducts(20, 0);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<ul data-bind="foreach:  data: $root.products, as: 'product' ">
  <li data-bind="text: product"></li>
</ul>

【讨论】:

以上是关于为啥 ko.ObservableArray 中的替换值没有更新我的视图?的主要内容,如果未能解决你的问题,请参考以下文章

仅从 ko.observableArray 发送更新的对象

Knockoutjs递归地展开ko.observableArray

如何将 json 字符串转换为 ko.observableArray([]),他们得到一个错误数据未定义?

为什么Javascript代码在ko.observableArray()中执行;

observableArray未通过完整数组传递更新

KnockoutJS:将 Observable 属性和函数添加到映射生成的 ObservableArray 中的对象