2014-11-04 4 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; 
     } 
    }; 
}); 

Я инъекционного это значение в моем контроллере как МТО и использовать его следующим образом:

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, это решило это! –

Смежные вопросы