1
1
<!DOCTYPE html>
2
2
< html lang ="en ">
3
3
< head >
4
+ <!--[if lt IE 9]>
5
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
6
+ <![endif]-->
7
+
4
8
< meta charset ="utf-8 ">
5
9
< meta http-equiv ="X-UA-Compatible " content ="IE=edge ">
6
10
< meta name ="viewport " content ="width=device-width, initial-scale=1 ">
7
11
< title > Knockout.js demo</ title >
8
12
9
13
< link rel ="stylesheet " href ="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css ">
10
- < link rel ="stylesheet " href ="//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.2.2/gridstack.min.js "/>
11
-
12
14
< link rel ="stylesheet " href ="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.2.0/css/font-awesome.min.css "/>
13
- < link rel ="stylesheet " href ="//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.2.1/gridstack.min.css "/>
14
-
15
- <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
16
- <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
17
- <!--[if lt IE 9]>
18
- <script src="//oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
19
- <script src="//oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
20
- <![endif]-->
15
+ < link rel ="stylesheet " href ="../gridstack.css "/>
21
16
22
17
< script src ="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js "> </ script >
23
18
< script src ="//cdnjs.cloudflare.com/ajax/libs/jqueryui/1.11.0/jquery-ui.js "> </ script >
24
- < script src ="//code.jquery.com/jquery-migrate-1.2.1.min.js "> </ script >
25
19
< script src ="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js "> </ script >
26
20
< script src ="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js "> </ script >
27
21
< script src ="//cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js "> </ script >
28
- < script src ="//cdnjs.cloudflare.com/ajax/libs/knockout.mapping/2.4.1/knockout.mapping.js "> </ script >
29
- < script src ="//cdnjs.cloudflare.com/ajax/libs/gridstack.js/0.2.2/gridstack.min.js "> </ script >
22
+ < script src ="../gridstack.js "> </ script >
30
23
31
24
< style type ="text/css ">
32
25
.grid-stack {
44
37
< div class ="container-fluid ">
45
38
< h1 > knockout.js Demo</ h1 >
46
39
40
+ < div >
41
+ < button data-bind ="click: add_new_widget "> Add new widget</ button >
42
+ </ div >
43
+
44
+ < br >
45
+
47
46
< div data-bind ="component: {name: 'dashboard-grid', params: $data} "> </ div >
48
47
</ div >
49
48
@@ -58,22 +57,17 @@ <h1>knockout.js Demo</h1>
58
57
this . widgets = controller . widgets ;
59
58
60
59
this . afterAddWidget = function ( items ) {
61
- _ . each ( items , function ( item ) {
62
- item = $ ( item ) ;
63
- if ( item . data ( '_gridstack_node' ) || item [ 0 ] . nodeType != 1 )
64
- return ;
65
-
66
- if ( grid == null ) {
67
- grid = $ ( componentInfo . element ) . find ( '.grid-stack' ) . gridstack ( {
68
- auto : false
69
- } ) . data ( 'gridstack' ) ;
70
- }
71
-
72
- grid . add_widget ( item ) ;
73
- ko . utils . domNodeDisposal . addDisposeCallback ( item [ 0 ] , function ( ) {
74
- grid . remove_widget ( item ) ;
75
- } ) ;
76
- } , this ) ;
60
+ if ( grid == null ) {
61
+ grid = $ ( componentInfo . element ) . find ( '.grid-stack' ) . gridstack ( {
62
+ auto : false
63
+ } ) . data ( 'gridstack' ) ;
64
+ }
65
+
66
+ var item = _ . find ( items , function ( i ) { return i . nodeType == 1 } ) ;
67
+ grid . add_widget ( item ) ;
68
+ ko . utils . domNodeDisposal . addDisposeCallback ( item , function ( ) {
69
+ grid . remove_widget ( item ) ;
70
+ } ) ;
77
71
} ;
78
72
} ;
79
73
@@ -83,16 +77,32 @@ <h1>knockout.js Demo</h1>
83
77
template :
84
78
[
85
79
'<div class="grid-stack" data-bind="foreach: {data: widgets, afterRender: afterAddWidget}">' ,
86
- ' <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}">' ,
87
- ' <div class="grid-stack-item-content" data-bind="text : $index" ></div>' ,
80
+ ' <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 }">' ,
81
+ ' <div class="grid-stack-item-content"><button data-bind="click : $root.delete_widget">Delete me</button ></div>' ,
88
82
' </div>' ,
89
- '</div>'
90
- ] . join ( '\n ' )
83
+ '</div> '
84
+ ] . join ( '' )
91
85
} ) ;
92
86
93
87
$ ( function ( ) {
94
88
var Controller = function ( widgets ) {
89
+ var self = this ;
90
+
95
91
this . widgets = ko . observableArray ( widgets ) ;
92
+
93
+ this . add_new_widget = function ( ) {
94
+ this . widgets . push ( {
95
+ x : 0 ,
96
+ y : 0 ,
97
+ width : Math . floor ( 1 + 3 * Math . random ( ) ) ,
98
+ height : Math . floor ( 1 + 3 * Math . random ( ) ) ,
99
+ auto_position : true
100
+ } ) ;
101
+ } ;
102
+
103
+ this . delete_widget = function ( item ) {
104
+ self . widgets . remove ( item ) ;
105
+ } ;
96
106
} ;
97
107
98
108
var widgets = [
@@ -102,7 +112,8 @@ <h1>knockout.js Demo</h1>
102
112
{ x : 1 , y : 2 , width : 4 , height : 2 }
103
113
] ;
104
114
105
- ko . applyBindings ( new Controller ( widgets ) ) ;
115
+ var controller = new Controller ( widgets ) ;
116
+ ko . applyBindings ( controller ) ;
106
117
} ) ;
107
118
</ script >
108
119
</ body >
0 commit comments