2014-11-04 75 views
1

我試圖遞歸調用我的映射功能,但越來越不定義的錯誤:「的ReferenceError:映射器沒有在規定的Object.mapper」如何調用的函數遞歸

能使用上如何調用一些指導函數遞歸地在這個特定的情況下。

angular.module('dvb.transferObjects').value('MappedTransferObject', function(obj1) { 
    'use strict'; 

    return { 
     mapper: function(obj2) { 
      for (var p in obj1) { 
       if (typeof obj1[p] === 'object') { 
        mapper(obj1[p], obj2[p]); 
       } else { 
        if(obj2.hasOwnProperty(p)) { 
         obj1[p] = obj2[p]; 
        } 
       } 
      } 
      return obj1; 
     } 
    }; 
}); 

我注入我的控制器MTO此值,並如下使用它:

var mto = new MTO(appState.getTemplateObject()); 
var mappedObject = mto.mapper($scope.dvModel); 

回答

1

如果名稱添加到您的匿名函數可以調用它本身裏面,像這樣:

angular.module('dvb.transferObjects').value('MappedTransferObject', function (obj1) { 
    'use strict'; 


    return { 
     mapper: function mapper(obj2) { 
      for (var p in obj1) { 
       if (typeof obj1[p] === 'object') { 
        mapper(obj1[p], obj2[p]); 
       } else { 
        if (obj2.hasOwnProperty(p)) { 
         obj1[p] = obj2[p]; 
        } 
       } 
      } 
      return obj1; 
     } 
    }; 
}); 

在您的示例中不能使用mapper的原因是由於mapper被限制在對象本身的範圍內。這意味着訪問功能將返回之前調用它通過對象,你不能這樣做,不保存關閉的對象的引用的唯一途徑:

angular.module('dvb.transferObjects').value('MappedTransferObject', function (obj1) { 
    'use strict'; 

    var mapper = { 
     mapper: function (obj2) { 
      for (var p in obj1) { 
       if (typeof obj1[p] === 'object') { 
        mapper.mapper(obj1[p], obj2[p]); 
       } else { 
        if (obj2.hasOwnProperty(p)) { 
         obj1[p] = obj2[p]; 
        } 
       } 
      } 
      return obj1; 
     } 
    }; 

    return mapper; 
}); 
+0

THX,這個解決它! – 2014-11-04 22:35:01