1+
2+ const ko = require ( 'knockout' ) ;
3+
4+ var startTime ;
5+ var lastMeasure ;
6+
7+ var startMeasure = function ( name ) {
8+ startTime = performance . now ( ) ;
9+ lastMeasure = name ;
10+ } ;
11+ var stopMeasure = function ( ) {
12+ window . setTimeout ( function ( ) {
13+ var stop = performance . now ( ) ;
14+ console . log ( lastMeasure + " took " + ( stop - startTime ) ) ;
15+ } , 0 ) ;
16+ } ;
17+
18+ var HomeViewModel = function ( ) {
19+ var self = this ;
20+ self . id = 1 ;
21+
22+ function _random ( max ) {
23+ return Math . round ( Math . random ( ) * 1000 ) % max ;
24+ }
25+
26+ function buildData ( count ) {
27+ var adjectives = [ "pretty" , "large" , "big" , "small" , "tall" , "short" , "long" , "handsome" , "plain" , "quaint" , "clean" , "elegant" , "easy" , "angry" , "crazy" , "helpful" , "mushy" , "odd" , "unsightly" , "adorable" , "important" , "inexpensive" , "cheap" , "expensive" , "fancy" ] ;
28+ var colours = [ "red" , "yellow" , "blue" , "green" , "pink" , "brown" , "purple" , "brown" , "white" , "black" , "orange" ] ;
29+ var nouns = [ "table" , "chair" , "house" , "bbq" , "desk" , "car" , "pony" , "cookie" , "sandwich" , "burger" , "pizza" , "mouse" , "keyboard" ] ;
30+ var data = [ ] ;
31+ for ( var i = 0 ; i < count ; i ++ ) {
32+ data . push ( new ItemViewModel ( {
33+ id : self . id ++ ,
34+ label : adjectives [ _random ( adjectives . length ) ] + " " + colours [ _random ( colours . length ) ] + " " + nouns [ _random ( nouns . length ) ]
35+ } , self ) ) ;
36+ }
37+ return data ;
38+ }
39+
40+ self . selected = ko . observable ( null ) ;
41+ self . data = ko . observableArray ( ) ;
42+
43+ self . run = function ( ) {
44+ startMeasure ( "run" ) ;
45+ self . data ( buildData ( 1000 ) ) ;
46+ self . selected ( null ) ;
47+ stopMeasure ( ) ;
48+ } ;
49+
50+ self . runLots = function ( ) {
51+ startMeasure ( "runLots" ) ;
52+ self . data ( buildData ( 10000 ) ) ;
53+ self . selected ( null ) ;
54+ stopMeasure ( ) ;
55+ } ;
56+
57+ self . add = function ( ) {
58+ startMeasure ( "add" ) ;
59+ ko . utils . arrayPushAll ( self . data , buildData ( 1000 ) ) ;
60+ stopMeasure ( ) ;
61+ } ;
62+
63+ self . update = function ( ) {
64+ startMeasure ( "update" ) ;
65+ var tmp = self . data ( ) ;
66+ for ( let i = 0 ; i < tmp . length ; i += 10 ) {
67+ tmp [ i ] . label ( tmp [ i ] . label ( ) + ' !!!' ) ;
68+ }
69+ stopMeasure ( ) ;
70+ } ;
71+
72+ self . clear = function ( ) {
73+ startMeasure ( "clear" ) ;
74+ self . data . removeAll ( ) ;
75+ self . selected ( null ) ;
76+ stopMeasure ( ) ;
77+ } ;
78+
79+ self . swapRows = function ( ) {
80+ startMeasure ( "swapRows" ) ;
81+ var tmp = self . data ( ) ;
82+ if ( tmp . length > 10 ) {
83+ var a = tmp [ 4 ] ;
84+ tmp [ 4 ] = tmp [ 9 ] ;
85+ tmp [ 9 ] = a ;
86+ self . data ( tmp ) ;
87+ }
88+ stopMeasure ( ) ;
89+ } ;
90+
91+ self . select = function ( id ) {
92+ startMeasure ( "select" ) ;
93+ self . selected ( id ) ;
94+ stopMeasure ( ) ;
95+ } ;
96+
97+ self . del = function ( item ) {
98+ startMeasure ( "delete" ) ;
99+ var tmp = self . data ( ) ;
100+ const idx = tmp . findIndex ( d => d . id === item . id ) ;
101+ self . data . splice ( idx , 1 ) ;
102+ stopMeasure ( ) ;
103+ } ;
104+ } ;
105+
106+ var ItemViewModel = function ( data , parent ) {
107+ var self = this ;
108+
109+ self . id = ko . observable ( data . id ) ;
110+ self . label = ko . observable ( data . label ) ;
111+
112+ self . del = function ( ) {
113+ parent . del ( self ) ;
114+ } ;
115+
116+ self . select = function ( ) {
117+ parent . select ( self . id ( ) ) ;
118+ } ;
119+ } ;
120+
121+ ko . applyBindings ( new HomeViewModel ( ) , document . getElementById ( 'main' ) ) ;
0 commit comments