2016-02-02 3 views
1

Я следующий массив, инициализируется с помощью map и Нокаут-х fromJS, как это:Override ToString объектов внутри массива

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, чтобы переопределить его для отдельных объектов, но что, когда они получают автофокус, как в моем случае? Я не знаю, как этого добиться. Заранее спасибо.

ответ

2

Переопределение toString не так, как я бы это сделал.

Я бы применил computed observable, который возвратил нужную строку.

Iein вашего ViewModel:

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

Затем измените HTML, чтобы связать текст с этим новым вычисленным:

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

Другим преимуществом вычисленного наблюдаемым является то, что при добавлении или удалить пункты из Products (которые будут observableArray), текст будет обновлен.