Second Try!

Less Crazy Code

by db_dev

HTML

<script src="//code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<link rel="stylesheet" href="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="//cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="//stackpath.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
<div class="container">
  <div class="row">
    <div class="col">
      

    <!-- ko foreach: ChatEntries -->
    <div class="chat-entry">
        <!-- ko if: $index() === 0 -->
        <span class="entry-sender"><img src="https://via.placeholder.com/50" alt=""/></span>
        <span class="entry-content" data-bind="html: Content"></span>
        <!-- /ko -->

        <!-- ko if: $parent.ChatEntries()[$index()-1]-->

        <!-- ko if: user !== ($parent.ChatEntries()[$index()-1].user)-->
        <span class="entry-sender"><img src="https://via.placeholder.com/50" alt=""/></span>
        <span class="entry-content" data-bind="html: Content"></span>
        <!-- /ko -->

        <!-- ko if: user === ($parent.ChatEntries()[$index()-1].user)-->
        <span class="entry-content" data-bind="html: Content"></span>
        <!-- /ko -->

        <!-- /ko -->
    </div>
    <!-- /ko -->



	
	
	
    </div>
  </div>  
</div>

CSS

.row {
    background: #f8f9fa;
    margin-top: 20px;
}

.col {
    border: solid 1px #6c757d;
    padding: 10px;
}

JavaScript

var viewModel = function() {
    var self = this;


    self.ChatEntries = ko.observableArray([{
        Content: "content 1",
        user: "user 1"
    }, {
        Content: "content 2",
        user: "user 1"
    }, {
        Content: "content 3",
        user: "user 2"
    }]);
}


ko.applyBindings(new viewModel());