如何在正确的上下文中引用Knockout.js对象和对象数组

时间:2014-01-11 23:18:30

标签: javascript jquery knockout.js

我似乎无法做到这一点:http://jsfiddle.net/dPyQy/4/

我想收集我在输入字段中输入的标签以进行保存。我需要将Textbatches作为一个SelectedText引用,因为在RL中我需要能够在Textbatches中进行选择。

var Textbatch = function (data,tags) {
    var self = this;

    self.TextbatchId = data.TextbatchId;
    self.Title = ko.observable(data.Title);
    self.Text = ko.observable(data.Text);
    self.TextTags = ko.observableArray(tags);

    function createTypeComputed(tagType) {
        return ko.computed(function () {
            return ko.utils.arrayFilter(self.TextTags(), function (item) {
                return item.Type() == tagType;
            });
        });
   }

   self.managerTags = createTypeComputed(0);

   self.removeTag = function (tagToRemove) {
       self.TextTags.remove(function (item) {
           return item.Id == tagToRemove.Id;
       });
   }
}

在背景和对象以及一切事物中苦苦挣扎。我想在输入字段下面列出所选标签,然后调试以显示更新后的对象。

任何帮助高度赞赏。感谢名单。

1 个答案:

答案 0 :(得分:1)

managerTags计算数组,但是你在text绑定中使用它,期望它计算为字符串。

您想如何展示它?作为HTML列表(使用foreach绑定循环标记),或作为逗号(或其他)分隔的字符串(在其上使用join)?

要获取以逗号分隔的字符串,请将createTypeComputed更改为

function createTypeComputed(tagType) {
  return ko.computed(function () {
    return ko.utils.arrayMap(      
      ko.utils.arrayFilter(self.TextTags(), function (item) {
         return item.Type() == tagType;
      }),
      function (item) {
        return item.Name();
      }).join(',');
    });
}

请注意,如果你可以指望使用ES5浏览器(除了IE< 9以外的任何东西),你可以简化计算的函数

    return self.TextTags().filter(function (item) {
        return item.Type() == tagType;
      })
      .map(function (item) {
        return item.Name();
      })
      .join(',');