使用knockout.js动态生成下拉列表和绑定选项

时间:2014-03-14 18:24:47

标签: knockout.js

这个小提示演示了我的问题:http://jsfiddle.net/timvdh/QMM5b/2/

如果"添加列表"将使用模型创建一个下拉列表。点击另一个将创建确定,更多点击将产生未绑定的列表。

这是因为额外的observable是在模型绑定后创建的,所以它们没用。

// this will create an observable which is not bound to the UI
if (!ko.isObservable(self.listData()[field]))
    self.listData()[field] = ko.observableArray([]);

我猜这种情况并不常见。我能做的是预先准备一个足够大的空observable列表(对于self.listData和self.data属性)。我真正的大胖单页应用需要一个未知数量的控件(通过JSON加载元数据),所以我希望有更好的方法。

1 个答案:

答案 0 :(得分:2)

您的代码中只有执行顺序错误:

  • 首先,您需要在self.listData()
  • 上创建新的可观察字段
  • 之后您需要将该字段添加到self.metaData.push(field);,因为这会触发foreach,届时您的观察结果将已经存在。

所以你的addMetaData应该是这样的:

self.addMetaData = function() {
    var field = "field" + self.fieldNum++;

    if (!ko.isObservable(self.listData()[field]))
        self.listData()[field] = ko.observableArray([]);

    if (!ko.isObservable(self.data()[field]))
        self.data()[field] = ko.observable("B");           

    self.listData()[field].push(new ListEntry("Value A", "A"));
    self.listData()[field].push(new ListEntry("Value B", "B"));

    self.metaData.push(field);
}

演示JSFiddle