2016-10-03 89 views
0

不知何故,我无法将我的数据从工厂方法传输到控制器。我使用JavaScript远程和工厂如下将数据从工厂传输到控制器

function userRecordFetchFactory($rootScope) { 
     var custRec = {}; 
      return {           
       checkRecordType : function(urlObject) { 
       function loadRecordType(err, records, event) { 
         if (err) { 
          displayReadingInformationErrorView(); 
         } else if (records != null && records.length == 0) { 
          displayReadingInformationErrorView(); 
         } else { 
          custRec = { 
           Name : records[0].get('Name'), 
           lat : records[0].get('Latitude__c'), 
           lon : records[0].get('Longitude__c'), 
           SiteStreet : records[0] 
             .get('SiteStreet__c'), 
           SiteCity : records[0].get('SiteCity__c'), 
           SiteCountryCode : records[0] 
             .get('SiteCountryCode__c'), 
           SitePostalCode : records[0] 
             .get('SitePostalCode__c'), 
           AddressID : records[0].get('AddressID__c'), 
           loaded : true 
          }; 

         } 
        } 
        if (urlObject && urlObject.aid 
          && urlObject.aid.startsWith(accPrefix)) { 
         objModel = new RemoteObjectModel.Account(); 
        } 
        if (urlObject && urlObject.aid 
          && urlObject.aid.startsWith(leadPrefix)) { 
         objModel = new RemoteObjectModel.Lead(); 
        } 

        if (objModel) { 
         objModel.retrieve({ 
          where : { 
           Id : { 
            eq : urlObject.aid 
           } 
          } 
         }, loadRecordType); 
        } 

        return custRec; 
       } 
      }; 
     } 

给我的控制器下面给出访问数据

function LocatorInitController($document, $scope, 
       userRecordFetchFactory) { 
       console.log("inside the controller"+urlParams); 
       $scope.CustomerSite = {}; 
       userRecordFetchFactory.checkRecordType(urlParams) 
       .then(function successData(data){ 
       $scope.CustomerSite = data.data; 
       execGeoCoding(); 
       }); 

我得到一个错误,无法读取的未定义的属性成功。在工厂中,checkRecordType方法具有一个检索函数,它是一个JavaScript远程调用,并且该函数具有对loadrecordtype的回调。

回答

0

你为什么不尝试重写你的工厂,像这样:

function Factory() { 
var custRec = { 

    subscribe: function(scope, callback) { 
     var handler = $rootScope.$on(
      'fire-event-accountservice-retrieve', 
      function(
       event, data) { 
       callback(data); 
       scope.$apply(); 
      }); 
     scope.$on('$destroy', handler); 
    }, 
    checkRecordType: function(urlObject) { 
     var custRec; 
     if (urlObject.aid == null && urlObject.addr == null) { 
      displayCurrentLocation(); 
     } 
     if (urlObject && urlObject.aid && 
      urlObject.aid.startsWith(accPrefix)) { 
      objModel = new RemoteObjectModel.Account(); 
     } 
     if (urlObject && urlObject.aid && 
      urlObject.aid.startsWith(leadPrefix)) { 
      objModel = new RemoteObjectModel.Lead(); 
     } 
     if (objModel == null && urlObject.aid != null && urlObject.addr == null) { 
      displayReadingInformationErrorView(); 
     } 
     if (objModel) { 
      objModel.retrieve({ 
       where: { 
        Id: { 
         eq: urlObject.aid 
        } 
       } 
      }, loadRecordType); 
     } else if ((urlObject.addr != null || urlObject.addr != '') && (typeof urlObject.addr != "undefined")) { 
      displayLocationBasedOnAddress(urlObject.addr); 
     } 

     function loadRecordType(err, records, event) { 
      if (err) { 
       displayReadingInformationErrorView(); 
      } else if (records != null && records.length == 0) { 
       displayReadingInformationErrorView(); 
      } else { 
       custRec = { 
        Name: records[0].get('Name'), 
        lat: records[0].get('Latitude__c'), 
        lon: records[0].get('Longitude__c'), 
        SiteStreet: records[0] 
         .get('SiteStreet__c'), 
        SiteCity: records[0].get('SiteCity__c'), 
        SiteCountryCode: records[0] 
         .get('SiteCountryCode__c'), 
        SitePostalCode: records[0] 
         .get('SitePostalCode__c'), 
        AddressID: records[0].get('AddressID__c'), 
        loaded: true 
       }; 

       /* $rootScope.$emit(
          'fire-event-accountservice-retrieve', 
          custRec); */ 
      } 
     } 

    } 
} 
return custRec; 
} 

你好像退回工厂对象走错了路。

+0

好吧,我已经重构代码,现在把。那么我的错误表示userRecordFetchFactory.checkRecordType(...)。那么这不是一个函数 –

+0

。这意味着你的客户正在期待一个承诺。仅仅从checkRecordType的简要概述,它看起来不像是一个承诺正在返回。 – westandy

1

建议您以更简单的方式编写工厂来阅读它。你所有的嵌套导致你不希望看到整个事情容易

把所有的访问成员往上顶

// pass functions as references to object properties 
// can easily see the whole factory object at top of the file 
var custRec = { 
    checkRecordType : checkRecordType, 
    subscribe  : subscribe  
}; 

return custRec; 


// move function declarations to the bottom and out of the way 

function checkRecordType(){ 
    /// do stuff 
    return stuff; 
} 

function loadRecordType(err, records, event) { 
    /// do stuff 
    return stuff; 
} 

function subscribe(scope, callback){ 
    /// do stuff 
    return stuff; 
} 

John Papa Angular STyle Guide

+0

loadRecordType不能超出checkRecordType。另外,您可以删除订阅功能,因为它是没有必要的。我仍然无法将数据传送给控制器。 –

+0

但为什么不呢?此外,您绝不应将范围传递到服务 – charlietfl

+0

loadRecordType是一种使用JavaScript远程处理获取salesforce中的数据的方法。因此,如果您查看调用loadRecordType的checkRecordType中的Retrieve函数。因此它不能在checkrecordtype –

0
function userRecordFetchFactory($rootScope) { 
var custRec = {}; 

    custRec.checkRecordType = function (urlObject) { 
     function loadRecordType(err, records, event) { 
      if (err) { 
       displayReadingInformationErrorView(); 
      } else if (records != null && records.length == 0) { 
       displayReadingInformationErrorView(); 
      } else { 
       custRec = { 
        Name: records[0].get('Name'), 
        lat: records[0].get('Latitude__c'), 
        lon: records[0].get('Longitude__c'), 
        SiteStreet: records[0] 
         .get('SiteStreet__c'), 
        SiteCity: records[0].get('SiteCity__c'), 
        SiteCountryCode: records[0] 
         .get('SiteCountryCode__c'), 
        SitePostalCode: records[0] 
         .get('SitePostalCode__c'), 
        AddressID: records[0].get('AddressID__c'), 
        loaded: true 
       }; 

      } 
     } 
     if (urlObject && urlObject.aid 
      && urlObject.aid.startsWith(accPrefix)) { 
      objModel = new RemoteObjectModel.Account(); 
     } 
     if (urlObject && urlObject.aid 
      && urlObject.aid.startsWith(leadPrefix)) { 
      objModel = new RemoteObjectModel.Lead(); 
     } 

     if (objModel) { 
      objModel.retrieve({ 
       where: { 
        Id: { 
         eq: urlObject.aid 
        } 
       } 
      }, 
return custRec; 
} 
相关问题