敲除绑定 - 使用 'id' 但不使用 'name'

knockout binding - working with 'id' but not with 'name'

我正在尝试通过研究现有的源代码并对它们进行小的改动来学习 knockoutjs。 我在这里试图理解的源代码是 RP Niemeyer 的淘汰赛示例-sortable.js。

原示例代码为here

我做了一些小改动 here

如下所示,这段代码的变化是在table中添加了一个属性 "name":

var Table = function(id, name, students) {
    this.students = ko.observableArray(students);
    this.students.id = id;
    this.students.name=name;
};

并且数据连续变化:

var initialTables = [
    new Table(1,"Table One",  [
        new Student(1, "Bobby", "male"),
        new Student(2, "Ted", "male"),
        new Student(3, "Jim", "male")
    ]),
    new Table(2,"Table Two", [
        new Student(4, "Michelle", "female"),
        new Student(5, "Erin", "female"),
        new Student(6, "Chase", "male")
    ]),
    new Table(3,"Table Three", [
        new Student(7, "Denise", "female"),
        new Student(8, "Chip", "male"),
        new Student(9, "Kylie", "female")
    ]),
    new Table(4,"Table Four", [
        new Student(10, "Cheryl", "female"),
        new Student(11, "Doug", "male"),
        new Student(12, "Connor", "male")
    ]),
    new Table(5,"Table Five", [
        new Student(13, "Cody", "male"),
        new Student(14, "Farrah", "female"),
        new Student(15, "Lyla", "female")
    ])
];

由于table id从字符串"Table Five"变为数字-5,结果面板可以看到连续变化..

现在,我将 html 代码从 <span data-bind="text: students.id"></span> 更改为 <span data-bind="text: students.name"></span>,如图 here

现在我希望 table 名称中的更改会恢复到 "Table Five" 但它只显示一个字母表 'd'

如果有人能告诉我我做错了什么,我将不胜感激..

我还添加了 <pre data-bind="text: ko.toJSON(tables,null,2)"></pre> 以查看 tables observable。 它显示以下数据:

[
  {
    "students": [
      {
        "id": 1,
        "name": "Bobby",
        "gender": "male"
      },
      {
        "id": 2,
        "name": "Ted",
        "gender": "male"
      },
      {
        "id": 3,
        "name": "Jim",
        "gender": "male"
      }
    ]
  },
  {
    "students": [
      {
        "id": 4,
        "name": "Michelle",
        "gender": "female"
      },
-----and so on-------

可以看出它只显示学生数组。我需要做什么才能将 tables 属性- 'id' 和 'name' 添加到此..

真诚感谢任何帮助..

谢谢

students 在这种情况下是一个 observableArray,它是一个函数。在许多浏览器中,函数的 name 属性 是只读的。如果您想将这样的 属性 直接添加到您的 observableArray,那么您需要选择一个不同的名称(正如@xdumaine 在上面的评论中注意到的那样)。

Knockout 可观察数组有一个 .name(因为它们实际上只是一个带有 knockout 附加功能的函数)属性,您不应尝试使用或覆盖它。尝试将 属性 命名为其他名称,或者更好的是,不要将其附加到 observableArray,而是将其附加到 table 本身:

var Table = function(id, name, students) {
    this.students = ko.observableArray(students);
    this.students.id = id;
    this.name = ko.observable(name);
};

http://jsfiddle.net/fzr4qfa8/