Skip to content

Commit 4e68974

Browse files
author
Vlad Balin
committed
deep options check to avoid re-creation of backbone view
1 parent 8b18b4b commit 4e68974

File tree

6 files changed

+246
-151
lines changed

6 files changed

+246
-151
lines changed

nestedreact.js

Lines changed: 124 additions & 74 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nestedreact.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/main.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ NestedReact.useView( Nested.View );
2121
// React component for attaching views
2222
NestedReact.subview = require( './view-element' );
2323

24+
NestedReact.tools = require( './tools' );
25+
2426
// Extend react components to have backbone-style jquery accessors
2527
var Component = React.createClass( { render : function(){} } ),
2628
BaseComponent = Object.getPrototypeOf( Component.prototype );

src/tools.js

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// equality checking for deep JSON comparison of plain Array and Object
2+
var ArrayProto = Array.prototype,
3+
ObjectProto = Object.prototype;
4+
5+
exports.jsonNotEqual = jsonNotEqual;
6+
function jsonNotEqual( objA, objB) {
7+
if (objA === objB) {
8+
return false;
9+
}
10+
11+
if (typeof objA !== 'object' || !objA ||
12+
typeof objB !== 'object' || !objB ) {
13+
return true;
14+
}
15+
16+
var protoA = Object.getPrototypeOf( objA ),
17+
protoB = Object.getPrototypeOf( objB );
18+
19+
if( protoA !== protoB ) return true;
20+
21+
if( protoA === ArrayProto ) return arraysNotEqual( objA, objB );
22+
if( protoA === ObjectProto ) return objectsNotEqual( objA, objB );
23+
24+
return true;
25+
}
26+
27+
function objectsNotEqual( objA, objB ){
28+
var keysA = Object.keys(objA);
29+
var keysB = Object.keys(objB);
30+
31+
if (keysA.length !== keysB.length) {
32+
return true;
33+
}
34+
35+
// Test for A's keys different from B.
36+
var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);
37+
38+
for (var i = 0; i < keysA.length; i++) {
39+
var key = keysA[i];
40+
if ( !bHasOwnProperty( key ) || jsonNotEqual( objA[ key ], objB[ key ] )) {
41+
return true;
42+
}
43+
}
44+
45+
return false;
46+
}
47+
48+
function arraysNotEqual( a, b ){
49+
if( a.length !== b.length ) return true;
50+
51+
for( var i = 0; i < a.length; i++ ){
52+
if( jsonNotEqual( a[ i ], b[ i ] ) ) return true;
53+
}
54+
55+
return false;
56+
}
57+
58+
// private array helpers
59+
exports.contains = contains;
60+
function contains( arr, el ){
61+
for( var i = 0; i < arr.length; i++ ){
62+
if( arr[ i ] === el ) return true;
63+
}
64+
65+
return false;
66+
};
67+
68+
exports.without = without;
69+
function without( arr, el ){
70+
var res = [];
71+
72+
for( var i = 0; i < arr.length; i++ ){
73+
var current = arr[ i ];
74+
current === el || res.push( current );
75+
}
76+
77+
return res;
78+
};
79+
80+
exports.clone = clone;
81+
function clone( objOrArray ){
82+
return objOrArray instanceof Array ? objOrArray.slice() : Object.assign( {}, objOrArray );
83+
};

0 commit comments

Comments
 (0)