使用敲除 foreach 的数据绑定不起作用

data binding with knockout foreach is not working

我是淘汰赛的新手,正在尝试使用 observableArray

将数据绑定到 foreach 循环

下面是我的 JS 和 HTML 代码,有人可以看看它并帮助我解决我哪里错了吗?我的主要问题是 foreach 没有按预期工作

JS代码

define(function(require) {
    var app = require('durandal/app');
    var ko = require('knockout');
    var todoList = ko.observableArray([new Todo("test")]);
    return {
        todoName: ko.observable(),
        createTodo: function() {
            todoList.push(new Todo(this.todoName()));
            console.log(todoList().length);
        }
    };

    function Todo(name) {
        return {
            todoName: ko.observable(name)
        };
    }
});

我的Html代码

<section>
    <h2>Create Todo</h2>
    <form class="form-inline">
        <fieldset>
            <label>Name</label>
            <input type="text" data-bind="value: todoName, valueUpdate: 'afterkeydown'" />
            <button type="submit" class="btn" data-bind="click: createTodo, enable: todoName">Click Me</button>
        </fieldset>
    </form>
</section>

<div class="row" data-bind="foreach: todoList">
    <div class="col-md-12">
        <label data-bind="text: todoName"></label>
    </div>
</div>

Knockout 正在寻找您在 ko.applyBindings 中使用的对象内部的 todoList。不要创建变量,而是将其设为要返回的对象的 属性。

这是一个工作片段:

function Todo(name) {
  return {
    todoName: ko.observable(name)
  };
}

function TodoViewModel() {
  return {
    todoList: ko.observableArray([new Todo("test")]),
    todoName: ko.observable(),
    createTodo: function() {
      this.todoList.push(new Todo(this.todoName()));
      console.log(this.todoList().length);
    }
  };
}

ko.applyBindings(TodoViewModel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<section>
  <h2>Create Todo</h2>
  <form class="form-inline">
    <fieldset>
      <label>Name</label>
      <input type="text" data-bind="value: todoName, valueUpdate: 'afterkeydown'" />
      <button type="submit" class="btn" data-bind="click: createTodo, enable: todoName">Click Me</button>
    </fieldset>
  </form>
</section>

<div class="row" data-bind="foreach: todoList">
  <div class="col-md-12">
    <label data-bind="text: todoName"></label>
  </div>
</div>