淘汰赛绑定 - 使用' id'但没有' name'

时间:2015-02-02 14:29:33

标签: knockout.js

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

原始示例代码为here

我做了一些小变化here

此代码中的更改如下所示是添加属性" 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")
    ])
];

由于表格ID已从字符串"表五"在数字-5中,可以在结果窗格中查看连续的更改。

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

现在我曾希望表名的变化会回到&#34;表五&#34;但它只显示一个字母“&#39;

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

此外,我已添加<pre data-bind="text: ko.toJSON(tables,null,2)"></pre>来查看可观察的表格。 它显示以下数据:

[
  {
    "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-------

可以看出它只显示学生阵列..我需要做什么来添加表格属性&#39; id&#39;和&#39; name&#39;对此...

真心感谢任何帮助。

由于

2 个答案:

答案 0 :(得分:2)

在这种情况下,

studentsobservableArray,这是一个函数。在许多浏览器中,函数的name属性是只读的。如果你想直接向你的observableArray添加这样的属性,那么你会想要选择一个不同的名字(如上面评论中注意到的@xdumaine)。

答案 1 :(得分:1)

Knockout可观察数组具有.name(因为它们实际上只是具有敲除额外功能的函数)属性,您不应该尝试使用或覆盖。尝试将该属性命名为其他内容,或者更好的是,不要将其附加到observableArray,并将其附加到表本身:

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

http://jsfiddle.net/fzr4qfa8/