我正在尝试自动更新属于文本对象的3个“标签”字段(“ ManagerTags”,“ EmployeeTags”和“ LocationTags”)。
每个“标签”字段都是来自“ 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: [',', ' ']}"/>


没有明显的循环引用,如何实现这种2向绑定?

最佳答案

我很难弄清楚您要做什么。但是我想我有个主意。我唯一可以建议的是,您的Textbatch对象对于所选过滤器具有可观察的对象。然后订阅那个可观察的。即将其添加到您的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语句更新整个对象。

09-07 22:57