我在视图上使用knockout js来显示字段列表(即名字,姓氏等)。使用可观察数组在淘汰模板中列出这些字段。该模板包含以下字段:名称(输入),翻译(选择)和添加/删除功能。 (见下文)
var viewModel = {
Fields: ko.observableArray([new Field(2, "First Name", 1), new Field(3, "Last Name", 2)]),
AvailableTranslations: ko.observableArray([new Translation(1, "Prefixes"), new Translation(2, "Suffixes")]),
remove: function(item) {
ko.utils.arrayRemoveItem(this.Fields, item)
},
add: function() {
this.Fields.push(new Field(0, "", ""));
}
};
var Translation = function(id, name) {
this.ID = id;
this.Name = name;
};
var Field = function(id, name, translationID){
this.ID = ko.observable(id);
this.Name = ko.observable(name);
this.TranslationID = ko.observable(translationID);
};
在模板中的翻译选择列表旁边,我想要一个选项来添加一个不存在的新翻译。单击按钮时,我想打开一个jquery UI对话框,其中包含使用knockout的局部视图。部分视图将包含翻译名称以及旧值和新值(两个文本字段)。旧值和新值是可观察的数组。
var viewModelPartialDialog = {
TranslationName: ko.observable(),
Values: ko.observableArray([]),
};
var Value = function(id, oldVal, newVal) {
this.ID = id;
this.OldVal = oldVal;
this.NewVal = newVal;
};
当用户提交部分视图的表单时,我希望它进行保存调用以及更新AvailableTranslations可观察数组。
任何人都可以帮助我或指出正确的方向来实现这个目标吗?
谢谢你的例子。这很有帮助,但不完全是我想要做的。在您的示例中,我无法将observableArray添加到Product,然后在对话框的编辑模板中有一个嵌套模板。
回到我的原始示例,我想在viewModelA中添加新字段,类似于您拥有产品列表的方式。但是,我不打算在对话框中编辑字段,而是打开一个对话框来添加新的翻译。在对话框中打开的新翻译将是一个单独的视图模型(viewModelB)。添加转换名称和值后,对话框将异步发布,然后更新原始视图模型(viewModelA)的AvailableTranslations可观察数组。
您能提供此功能的示例吗?
答案 0 :(得分:11)
以下示例可能类似于您正在执行的操作:http://jsfiddle.net/rniemeyer/WpnTU/
它在页面加载时设置对话框,但不打开它。然后,有一个自定义绑定处理程序,只要填充了“selectedItem”observable(可以使用现有项目或新项目),就会调用它。
简单的自定义绑定处理程序如下所示:
//custom binding handler that opens the jQuery dialog, if the selectedProduct is populated
ko.bindingHandlers.openDialog = {
update: function(element, valueAccessor) {
var value = ko.utils.unwrapObservable(valueAccessor());
if (value) {
$(element).dialog("open");
}
}
}