JSFiddle - React, Tailwind, and code Playground

by spstieng

HTML

<link rel="stylesheet" href="http://getbootstrap.com/dist/css/bootstrap.min.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="wrapper">
    
  <div class="input-group">
    <input type="hidden" value="" data-bind="value: item_id" />
    <input class="form-control" type="search" data-bind="value: item_name" />     
      
    <span class="input-group-btn">
      <button class="btn" data-bind="click: addItem, enable: function(){ item_name().length > 0;}">Add</button>
    </span>
  </div>

  <ul class="list-group" data-bind="template: { name: 'item-template', data: $root.items}">
    <li class="list-group-item">
      <span id="123" data-bind="text: item_name, attr: {'id': item_id}">Americanino</span>
      <span class="glyphicon glyphicon-remove-circle" data-bind="click: $parent.removeItem"></span>
    </li>      
      
    <li class="list-group-item">
      <span id="223" data-bind="text: item_name, attr: {'id': item_id}">Asos</span>
      <span class="glyphicon glyphicon-remove-circle" data-bind="click: $parent.removeItem"></span>
    </li>            
  </ul>    

  <script type="text/html" id="item-template">
    <!--ko foreach: $data-->    
      <li class="list-group-item">
        <span id="" data-bind="text: item_name, attr: {'id': item_id}"></span>
        <span class="glyphicon glyphicon-remove-circle" data-bind="click: $root.removeItem"></span>
      </li>            
    <!-- /ko -->
  </script>  
</div>

CSS

.wrapper {
    width: 300px;
}

.input-group {
    margin-bottom: 20px;        
}

.glyphicon {
    float: right;
    cursor: pointer;
    color: #5577CC;
}

JavaScript

function item(id, name){
    var self = this;
    self.item_id = ko.observable(id);
    self.item_name = ko.observable(name);    
}

function create_list(exiting_list){
    var arr_list = [];
    
    $(exiting_list).find('li').each(function(e,li){
        var id = $(li).find('span').prop('id');
        var name = $(li).find('span').html();
        arr_list.push({
            item_id: id,
            item_name: name
        });
    });
    return arr_list;
}

var itemListModel = function() {
    var self = this;
    
    // Data
    var exiting_list = $('.list-group').clone();        
    self.items = ko.observableArray(create_list(exiting_list));
    self.item_name = ko.observable('');
    self.item_id = ko.observable('');
    
    // Operations
    self.addItem = function() {
        if (self.item_name() != "") {
            self.items.push(new item(self.item_id(),self.item_name()));
            self.item_name("");
        }
    }.bind(self);
    
    // Remove brand
    self.removeItem = function(item) {
        self.items.remove(item);
    }
};

ko.applyBindings(new itemListModel());