Przeglądaj źródła

make data merge recursive (followup in #594)

Evan You 11 lat temu
rodzic
commit
52cdd18584

+ 8 - 3
src/util/merge-option.js

@@ -16,13 +16,18 @@ var extend = _.extend
 var strats = Object.create(null)
 
 /**
- * Helper that merges two data objects together
+ * Helper that recursively merges two data objects together.
  */
 
 function mergeData (to, from) {
-  for (var key in from) {
+  var key, toVal, fromVal
+  for (key in from) {
+    toVal = to[key]
+    fromVal = from[key]
     if (!to.hasOwnProperty(key)) {
-      to.$add(key, from[key])
+      to.$add(key, fromVal)
+    } else if (_.isObject(toVal) && _.isObject(fromVal)) {
+      mergeData(toVal, fromVal)
     }
   }
   return to

+ 6 - 2
test/unit/specs/util/merge-option_spec.js

@@ -160,21 +160,25 @@ describe('Util - Option merging', function () {
 
   it('class data merge', function () {
     function fn1 () {
-      return { a: 1, c: 4 }
+      return { a: 1, c: 4, d: { e: 1 } }
     }
     function fn2 () {
-      return { a: 2, b: 3 }
+      return { a: 2, b: 3, d: { f: 2 } }
     }
     // both present
     var res = merge({data:fn1}, {data:fn2}).data()
     expect(res.a).toBe(2)
     expect(res.b).toBe(3)
     expect(res.c).toBe(4)
+    expect(res.d.e).toBe(1)
+    expect(res.d.f).toBe(2)
     // only parent
     res = merge({data:fn1}, {}).data()
     expect(res.a).toBe(1)
     expect(res.b).toBeUndefined()
     expect(res.c).toBe(4)
+    expect(res.d.e).toBe(1)
+    expect(res.d.f).toBeUndefined()
   })
 
   it('instanace el merge', function () {