我正在尝试自动更新属于Text对象的3个“Tags”字段(“ManagerTags”,“EmployeeTags”,“LocationTags”)。 每个Tags-field都是来自Tags = ko.observableArray()的过滤数组。
这是文本对象:
var Textbatch = function (data) {
var self = this;
self.TextbatchId = data.TextbatchId;
self.Title = ko.observable(data.Title);
self.Text = ko.observable(data.Text);
self.TextTags = ko.observableArray();
function createTypeComputed(tagType) {
return ko.computed(function () {
return ko.utils.arrayFilter(self.TextTags(), function (item) {
return item.Type() == tagType;
});
});
}
self.ManagerTags = createTypeComputed(0);
self.EmployeeTags = createTypeComputed(1);
self.LocationTags = createTypeComputed(2);
self.removeTag = function (tagToRemove) {
self.TextTags.remove(function (item) {
return item.Id == tagToRemove.Id;
});
}
}
标记对象如下所示:
var Tag = function(data){
var self = this;
self.Id = data.Id;
self.Name = ko.observable(data.Name);
self.Type = ko.observable(data.Type);
self.ParentTextId = data.TextId;
}
我想用过滤后的数组自动更新数组“TestTags()”(作为计算函数可能吗?)。即“ManagerTags()”(和“EmployeeTags()”和“LocationTags()”)与“TextTags()”双向绑定,而不仅仅是单向,如上面的代码所示。
请参阅小提琴:http://jsfiddle.net/mnnEe/
示例:我希望“Textbatch.ManagerTags()”是“Textbatch.TextTags()”的计算子集,其中TagType = 0。 但我想通过select2-plugin编辑和添加标签:
<input data-bind="value: ManagerTags, select2: {tags: ManagerTags, tokenSeparators: [',', ' ']}"/>
如果没有这个明显的循环引用,我怎样才能实现这种双向绑定?
答案 0 :(得分:0)
我很难弄清楚你想要做什么。但我想我有个主意。我唯一可以建议的是,Textbatch对象具有所选过滤器的可观察性。然后订阅那个observable。即将此添加到Textbatch对象。
self.selectedFilter = ko.observable(/*optionally set a default*/);
self.selectedFilter.subscribe(function(newValue){
switch(newValue){
case 0:
//Do your stuff
break;
case 1:
//Do your stuff
break;
case 2:
//Do your stuff
break;
default:
break;
}
});
现在,当您创建并更改为Textbatch.selectedFilter时,您可以通过switch语句更新整个对象。