var vm = {
boxes: ko.observableArray([]),
form: {
width: ko.observable(250),
height: ko.observable(250),
x: ko.observable(250),
y: ko.observable(250),
},
_addBox: function(width, height, x, y) {
this.boxes.push({
width: ko.observable(width),
height: ko.observable(height),
x: ko.observable(x),
y: ko.observable(y),
});
}
}
vm.addBox = function() {
this._addBox(this.form.width(), this.form.height(), this.form.x(), this.form.y())
}.bind(vm);
vm._addBox(100, 100, 0, 0);
vm._addBox(200, 100, 103, 50);
vm._addBox(200, 100, 306, 0);
vm._addBox(250, 100, 200, 153);
ko.applyBindings(vm);
.container {
border: thin solid black;
width: 550px;
height: 550px;
position: relative;
float: left;
}
.form {
float: left;
width: 200px;
}
.form label {
display: block;
}
.box {
position: absolute;
border: 3px solid black;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<div class="container" data-bind="foreach: boxes">
<div class="box" data-bind="style: { width: width() + 'px', height: height() + 'px', left: x() + 'px', bottom: y() + 'px' }"></div>
</div>
<div class="form" data-bind="with: form">
<label>Width
<input type="text" data-bind="value: width" />
</label>
<label>Height
<input type="text" data-bind="value: height" />
</label>
<label>X-coord
<input type="text" data-bind="value: x" />
</label>
<label>Y-coord
<input type="text" data-bind="value: y" />
</label>
<button data-bind="click: $root.addBox">Add Box</button>
</div>