【问题标题】:KnockoutJS: foreach binding array inside observableKnockoutJS:可观察到的 foreach 绑定数组
【发布时间】:2017-10-21 22:37:56
【问题描述】:

这是我的数据模型(调查):

{ 
 "name" : "x",
 "questions" : [ .... ]
}

这是我的视图模型:

survey : ko.observable(undefined)

这是我的数据绑定标签:

<ol data-bind="foreach: data.survey.questions">

它不起作用。如果我像这样更改绑定,它会起作用:

<ol data-bind="foreach: data.survey().questions">

问题是在 foreach 绑定中还有另一个 foreach 循环遍历问题的可能答案:

<div data-bind="foreach: answers">

我没有找到任何方法来使这个与我当前的设置一起工作。基本上我认为问题在于您需要使用observableArray,但我想在可观察对象内的数组上循环。

任何人都可以提出一种方法来使这种双 foreach 工作吗?谢谢!

【问题讨论】:

    标签: javascript knockout.js foreach


    【解决方案1】:

    Knockout observables 是函数。 To read the observable’s value, you need to call the observable with no parameters。因此,您需要 survey() 来访问具有 questions 属性的内部对象。


    我不确定为什么您的内部 foreach 绑定不起作用。我猜这是因为您将survey 设置为undefined。但由于外部foreach 正在工作,它不可能是那样。你提到,“我认为问题是你需要使用 observableArray”。那没有必要。 Knockout 的默认绑定处理程序,包括foreach 绑定,在内部使用ko.utils.unwrapObservable() 处理此问题。唯一的区别是,如果它是observableArray,将来对数组的任何更改都将反映在 UI 上。但如果它是一个常规数组,那么 UI 将不会更新。

    所以,如果每个question 中有一个名为answers 的数组,那么它应该可以工作。这是一个有效的sn-p。

    var data = {
      survey: ko.observable({
        "name": "x",
        "questions": [{
          text: "Who let the dogs out?",
          answers: [
           {number: 1,text: "Cats"}, 
           {number: 2,text: "Baha Men"}
          ]
        }, {
          text: "What does the fox say?",
          answers: [
           {number: 1,text: "Woof Woof"}, 
           {number: 2,text: "Ring-ding-ding-dingeringeding"}, 
           {number: 3,text: "Meow Meow"}
          ]
        }]
      })
    };
    
    ko.applyBindings(data)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.1/knockout-min.js"></script>
    <ol data-bind="foreach: survey().questions">
      <li>
        <span data-bind="text: text"></span>
        <br> Answers:
    
        <ul data-bind="foreach: answers">
          <li data-bind="text:text">
          </li>
        </ul>
      </li>
    </ol>

    Here's a fiddle for testing

    【讨论】:

    • 感谢您的帮助。我的代码和你的完全一样。唯一的区别是 applyBinding。由于我正在研究 RIA,并且我动态切换页面内容,因此我使用了这个 sn-p: ko.applyBindings({"data" : data}, $(".page-content")[0]);另外,奇怪的是我没有收到错误,这在对象的嵌套元素(如文本问题)中完美无缺,但在嵌套的 foreach 中却没有......
    • @Aurasphere 这很奇怪。我创建了a fiddle 来模仿你的结构。确保您已正确嵌套数组和 html。
    • 我已经解决了这个问题!它似乎是由未定义的嵌套绑定引起的,阻止了父级以某种方式绑定......我为修复它所做的只是在未定义的绑定之前添加对父级($data)的引用。这让 KO 自己初始化值,即使我仍然不清楚为什么我在控制台中没有收到任何错误以及为什么这不是默认行为(尽管我是 JS 新手)。这是拯救我的答案:stackoverflow.com/a/9281765/4921205 如果没有您的调试帮助,我将无法解决此问题!非常感谢!
    猜你喜欢
    • 2017-11-25
    • 2012-11-02
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2017-07-26
    • 2013-05-23
    相关资源
    最近更新 更多