这个小提示演示了我的问题: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加载元数据),所以我希望有更好的方法。
答案 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。