2016-02-08 2 views
1

Я на следующие объекты:Как объединить все элементы в наблюдаемом массиве с помощью нокаута?

var Transaction = function (data) { 
    this.ID = ko.observable(data.transaction.ID); 
    this.number = ko.observable(data.transaction.number); 
    this.userID = ko.observable(data.transaction.userID); 
    this.password = ko.observable(data.transaction.password); 

    this.Properties = ko.observableArray(data.Property); 
} 

Свойства наблюдаемым массив выглядит следующим образом (в формате JSON):

[{"address1":"111 Broadway","city":"Brooklyn","state":"NY","zip":null}, 
{"address1":"222 Broadway","city":"Brooklyn","state":"NY","zip":null}] 

В моем HTML у меня есть что-то вроде этого:

<span>PROPERTY</span> 
<span data-bind="foreach: Properties"> 
<span data-bind="text: address1"></span> 
<span data-bind="text: city"></span> 
span data-bind="text: state"></span> 
<span data-bind="text: zip"></span> 
</span> 

В браузере он выглядит так:

PROPERTY 
111 Broadway 
Brooklyn 
NY 
222 Broadway 
Brooklyn 
NY 

И я хочу, чтобы это выглядело как:

111 Broadway, Brooklyn, NY 
222 Broadway, Brooklyn, NY 

Любые советы?

+0

кажется ваши пролеты быть оформлены в виде блочных элементов. как выглядит ваша таблица стилей? – dfperry

ответ

1

Вы можете создать вычисляемое свойство в Transaction прототипа как Propertiesсписке, что бы упростить HTML-разметку, связанную с ним.

this.propertyView = ko.pureComputed(function() { 
    return this.Properties().map(function(prop) { 
    var singleProp = ''; 
    for (var p in prop) 
     if (prop[p]) 
     singleProp += prop[p] + ', '; 
    return singleProp.slice(0,-2); 
    }); 
}, this); 
<span>PROPERTIES</span> 
<!-- ko foreach: propertyView --> 
<p data-bind="text: $data"></p> 
<!-- /ko --> 
+0

Это именно то, что я искал! Он отлично работает, спасибо! Еще один маленький вопрос: как я могу избавиться от нулевых значений? теперь это выглядит так: 111 Broadway, Brooklyn, NY, null 222 Broadway, Brooklyn, NY, null – user3378165

+0

Если вы предлагаете использовать 'for..in', не забудьте также использовать' hasOwnProperty'. OP может включать условие не-null из предыдущего комментария в том же самом выражении 'if'. – Jeroen

+0

@ user3378165 Я обновил свой ответ, чтобы сделать именно это :). @Jeroen, мне любопытно, как 'prop.hasOwnProperty (p) && prop [p]' лучше, чем 'prop [p]' в условии if? Я не думаю, что это имеет значение здесь, скажите мне, если я пропустил сценарий. – Tyblitz

1

Вы должны обернуть эти свойства "foreached" в элементе уровня блока, например, p или теге div, например. как это:

var Transaction = function (data) { 
 
    this.ID = ko.observable(data.transaction.ID); 
 
    this.number = ko.observable(data.transaction.number); 
 
    this.userID = ko.observable(data.transaction.userID); 
 
    this.password = ko.observable(data.transaction.password); 
 
    this.Properties = ko.observableArray(data.properties); 
 
}; 
 

 
var vm = new Transaction({ 
 
    transaction: { ID: 1, number: 2, userID: 3, password: 'secret' }, 
 
    properties: [{"address1":"111 Broadway","city":"Brooklyn","state":"NY","zip":null}, 
 
       {"address1":"222 Broadway","city":"Brooklyn","state":"NY","zip":null}] 
 
}); 
 

 
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
<h1> 
 
    <span data-bind="text: ID"></span> - 
 
    <span data-bind="text: number"></span> - 
 
    <span data-bind="text: userID"></span> - 
 
    <span data-bind="text: password"></span> 
 
</h1> 
 
<span>PROPERTIES</span> 
 
<!-- ko foreach: Properties --> 
 
<p> 
 
    <span data-bind="text: address1"></span> 
 
    <span data-bind="text: city"></span> 
 
    <span data-bind="text: state"></span> 
 
    <span data-bind="text: zip"></span> 
 
</p> 
 
<!-- /ko -->

+0

Спасибо за ваш ответ, я хотел бы объединить значения в коде, а не в HTML. Спасибо. – user3378165

Смежные вопросы