I am trying to learn knockout and I am following these two tutorials:
Tutorial 1
Best Example
But after half a day of trying (and failing), I cannot add or remove an item.
Here is my violin .
Any help would be greatly appreciated!
To clarify
Why self.items.push()does not add a new item to my list? Is it because of the property self.item_id?
My HTML looks like this:
<input type="hidden" value="" data-bind="value: item_id" />
<input class="form-control" type="search" data-bind="value: item_name" />
<button class="btn" data-bind="click: addItem, enable: item_name().length > 2">Add</button>
<ul data-bind="foreach: items">
// This list is retrieved from database on page load
<li class="list-group-item">
<span id="123" data-bind="text: item_name, attr: {'id': item_id}">Americanino</span>
<span data-bind="click: $parent.removeItem"></span>
</li>
<li class="list-group-item">
<span id="842" data-bind="text: item_name, attr: {'id': item_id}">Diesel</span>
<span data-bind="click: $parent.removeItem"></span>
</li>
</ul>
And my JS looks like this:
function item(id, name){
var self = this;
self.item_id = ko.observable(id);
self.item_name = ko.observable(name);
alert(self.item_id() + ' - ' + self.item_name());
}
var manageListModel = function() {
var self = this;
self.items = ko.observableArray();
self.item_id = ko.observable('345');
self.item_name = ko.observable();
self.addItem = function() {
if (self.item_name() != "") {
self.items.push(new item(self.item_id(),self.item_name()));
self.item_name("");
}
}.bind(self);
self.removeItem = function(item) {
alert('tert');
self.items.remove(item);
}
};
ko.applyBindings(new manageListModel());
UPDATE
So, after a few headshots in the wall, I finally found a solution that works very well. Hope this code helps others with similar problems :)
So what have I done?
:
( )
HTML:
<input type="hidden" value="" data-bind="value: item_id" />
<input class="form-control" type="search" data-bind="value: item_name" />
<button class="btn" data-bind="click: addItem, enable: function(){item_name().length > 2}">Add</button>
<ul data-bind="template: { name: 'item-item-template', data: $root.items}">
// This list is retrieved from database on page load
<li class="list-group-item">
<span id="123" data-bind="text: item_name, attr: {'id': item_id}">Americanino</span>
<span data-bind="click: $parent.removeItem"></span>
</li>
<li class="list-group-item">
<span id="842" data-bind="text: item_name, attr: {'id': item_id}">Diesel</span>
<span data-bind="click: $parent.removeItem"></span>
</li>
</ul>
<script type="text/html" id="item-item-template">
<li>
<span id="" data-bind="text: item_name, attr: {'id': item_id}"></span>
<a href="#" class="remove el-icon-remove-circle" data-bind="click: $root.removeitem"></a>
</li>
</script>
JS
function brand(name, id) {
var self = this;
self.item_name = ko.observable(name);
self.item_id = ko.observable(id);
}
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 manageitemListModel = function() {
var self = this;
var exiting_list = $('.item-list ul').clone();
self.items = ko.observableArray(create_list(exiting_list));
self.item_name = ko.observable('');
self.item_id = ko.observable('');
self.additem = function() {
if (self.item_name() != "") {
self.items.push(new item(self.item_name(),self.item_id()));
self.item_name("");
}
}.bind(self);
self.removeitem = function(item) {
self.items.remove(item);
}
};
ko.applyBindings(new manageitemListModel());