observableArray不会随着传递的完整数组而更新

时间:2018-08-30 15:57:28

标签: knockout.js

我有一个填充的observableArray,后来我需要用其对应的UI更新替换其内部的数组。它什么也没更新。

JS

showFirst: ko.observable(true);
orders: ko.observableArray();
orders(firstArray);

function changeArray(){orders(secondArray); showFirst(false);}

HTML

<!-- ko if: showFirst() -->
<!-- ko foreach: orders() -->
    <p data-bind="text: property1"></p>
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: showFirst() -->
<!-- ko foreach: orders() -->
    <p data-bind="text: property2"></p>
<!-- /ko -->
<!-- /ko -->

即使我可以使用ko扩展名检查订单是否已更新,但它仍在尝试检查property1。

2 个答案:

答案 0 :(得分:0)

您可以这样做:

showFirst: ko.observable(true);
orders: ko.observableArray();
orders(firstArray);

function changeArray(){orders(secondArray); showFirst(false);}

<!-- ko foreach: orders() -->
    <p data-bind="text: showFirst() ? property1 : property2"></p>
<!-- /ko -->

这个想法是在绑定中使用三元运算符。

答案 1 :(得分:0)

[应该是注释,但之后我无法分享此代码。]

我无法对此进行复制。看看下面发生了什么,看看是否有帮助。

var model={
  showFirst: ko.observable(true),
  orders: ko.observableArray([
    {property1:"p1",property2:"p2"},
    {property1:"p11",property2:"p22"}]),
  triggeredByAClick:function(){
    this.orders([
      {property1:"pp1",property2:"pp2"},
      {property1:"pp11",property2:"pp22"}]); 
    this.showFirst(false);
  }
}

ko.applyBindings(model);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<!-- ko if: showFirst() -->
<!-- ko foreach: orders() -->
    <p data-bind="text: property1"></p>
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: showFirst() -->
<!-- ko foreach: orders() -->
    <p data-bind="text: property2"></p>
<!-- /ko -->
<!-- /ko -->
<button data-bind="click:triggeredByAClick">click</button>