I am relatively new to Gridstack and Knockout JS.
Trying to figure out for the past days why the widgets are not deleted properly whenever the browser is resized.
Note: this issue happens on all browsers.
Scenario A: "Without resizing Browser"
Here's the initial display of the code
I am able to delete the widgets when the browser size is not changed.
Scenario B: "Browser is resized (Vertically)"
After adding widgets (or you can refresh the browser to display default again), I have resized the browser vertically.
It's strange when I try to delete the widgets after it realigns it doesn't get removed.
Is this a known issue for Gridstack or Knockout?
Any help is highly appreciated.
Here the code:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Investigation Sample 1</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="https://github.com/troolee/gridstack.js/tree/master/dist/gridstack.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.0/jquery-ui.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.5.0/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://github.com/troolee/gridstack.js/tree/master/dist/gridstack.js"></script>
<script src="https://github.com/troolee/gridstack.js/tree/master/dist/gridstack.jQueryUI.js"></script>
<style type="text/css">
.grid-stack {
background: lightgoldenrodyellow;
}
.grid-stack-item-content {
color: #2c3e50;
text-align: center;
background-color: #18bc9c;
}
</style>
</head>
<body>
<div class="container-fluid">
<h1> Investigation Sample 1</h1>
<div>
<button data-bind="click: addNewWidget">Add new widget</button>
</div>
<br>
<div data-bind="component: {name: 'dashboard-grid', params: $data}"></div>
</div>
<script type="text/javascript">
ko.components.register('dashboard-grid', {
viewModel: {
createViewModel: function(controller, componentInfo) {
var ViewModel = function(controller, componentInfo) {
var grid = null;
this.widgets = controller.widgets;
this.afterAddWidget = function(items) {
if (grid == null) {
grid = $(componentInfo.element).find('.grid-stack').gridstack({
auto: false
}).data('gridstack');
}
var item = _.find(items, function(i) {
return i.nodeType == 1
});
grid.addWidget(item);
ko.utils.domNodeDisposal.addDisposeCallback(item, function() {
grid.removeWidget(item);
});
};
};
return new ViewModel(controller, componentInfo);
}
},
template: [
'<div class="grid-stack" data-bind="foreach: {data: widgets, afterRender: afterAddWidget}">',
' <div class="grid-stack-item" data-bind="attr: {\'data-gs-x\': $data.x, \'data-gs-y\': $data.y, \'data-gs-width\': $data.width, \'data-gs-height\': $data.height, \'data-gs-auto-position\': $data.auto_position}">',
' <div class="grid-stack-item-content"><button data-bind="click: $root.deleteWidget">Delete Button</button></div>',
' </div>',
'</div> '
].join('')
});
$(function() {
var Controller = function(widgets) {
var self = this;
this.widgets = ko.observableArray(widgets);
this.addNewWidget = function() {
this.widgets.push({
x: 0,
y: 0,
//width: Math.floor(1 + 3 * Math.random()),
//height: Math.floor(1 + 3 * Math.random()),
width: 2,
height: 3,
auto_position: true
});
return false;
};
this.deleteWidget = function(item) {
self.widgets.remove(item);
return false;
};
};
var widgets = [{
x: 0,
y: 0,
width: 2,
height: 2
},
{
x: 2,
y: 0,
width: 4,
height: 2
},
{
x: 6,
y: 0,
width: 2,
height: 4
},
{
x: 1,
y: 2,
width: 4,
height: 2
}
];
var controller = new Controller(widgets);
ko.applyBindings(controller);
});
</script>
</body>
</html>