【问题标题】:data binding with knockout foreach is not working与淘汰赛 foreach 的数据绑定不起作用
【发布时间】:2019-05-01 12:46:52
【问题描述】:

我不熟悉淘汰赛并尝试使用 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>

【问题讨论】:

  • 你在哪里做你的 ko.applyBindings() ?
  • 其实我在关注this的例子和模式

标签: javascript data-binding knockout.js


【解决方案1】:

Knockout 正在您在ko.applyBindings 中使用的对象内寻找todoList。与其创建变量,不如将其作为返回对象的属性。

这是一个有效的 sn-p:

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>

【讨论】:

  • 感谢您的回答。我已更改代码并将todoList 放入return 语句中,现在一切正常,但我仍然怀疑您是否可以回答,每当我申请任何课程时这个&lt;label data-bind="text: todoName" class='label'&gt;&lt;/label&gt; 标签停止工作你知道为什么吗?
  • 在你的代码片段中它工作正常,但你能用我的方式检查一下吗?它不适合我
  • 这只是一个类。这应该不是问题(fiddle)。 label类有没有display:none
  • 不知道,但有些奇怪,它有时能工作,有时不能!
猜你喜欢
  • 2014-01-10
  • 2015-05-06
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多