覆盖数组内对象的toString

时间:2016-02-02 11:51:55

标签: javascript arrays knockout.js

我有以下数组,使用map和knockout fromJS进行初始化,如下所示:

self.loadProducts = function (applyBindings) {
    $.ajax({
        type: "GET",
        url: urlGetProducts,
        success: function (data) {
            self.Products($.map(data[0].Value, function (item) { return ko.mapping.fromJS(item) }));
        },
    });
};

现在每个产品都包含一个名为Tags的属性,我绑定在span上:

<tbody data-bind="foreach: Products">
    <tr role="row">
        <td><span data-bind="text: Tags"></span></td>
    </tr>
</tbody>

结果是span将包含文本Tags'toString(),因为它是一个数组,默认情况下,toString函数显示分隔的项目用逗号(,)。我想要的是覆盖这个方法,并用空格+逗号正确显示它们。

在文档之后,我发现你可以使用Obj.prototype.toString覆盖单个对象,但是当他们像我的情况一样自动映射时会怎样?我不知道如何实现这一目标。提前谢谢。

1 个答案:

答案 0 :(得分:2)

覆盖toString不是我的方式。

我实现了一个返回所需字符串的computed observable

即你的ViewModel:

self.TagsText = ko.computedd(function() {
  // compose text with the contents of the array
  return text;
}, self);

然后,更改你的html以将文本绑定到这个新的计算:

<span data-bind="text: TagsText">

计算的observable的另一个优点是,如果您添加或删除Products中的项目(该项目为observableArray),则文本将更新。