2014-11-04 77 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