Передача данных с фабрики на контроллер

#javascript #angularjs

#javascript #angularjs

Вопрос:

Почему-то я не могу передать свои данные из заводского метода в контроллер. Я использую удаленное управление javascript, и завод приведен ниже

 function userRecordFetchFactory($rootScope) {
        var custRec = {};   
            return {                                        
                checkRecordType : function(urlObject) {
                 function loadRecordType(err, records, event) {
                        if (err) {
                            displayReadingInformationErrorView();
                        } else if (records != null amp;amp; 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 amp;amp; urlObject.aid
                            amp;amp; urlObject.aid.startsWith(accPrefix)) {
                        objModel = new RemoteObjectModel.Account();
                    }
                    if (urlObject amp;amp; urlObject.aid
                            amp;amp; 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();
                });
  

Я получаю сообщение об ошибке не удается прочитать свойство успеха undefined. На фабрике метод checkRecordType имеет функцию извлечения, которая является удаленным вызовом javascript, и эта функция имеет обратный вызов loadrecordtype .

Ответ №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;
}
  

См. Руководство Джона Папы по угловому стилю

Комментарии:

1. loadRecordType не может быть вне checkRecordType . Кроме того, вы можете удалить функцию подписки, поскольку она не нужна. Тем не менее, у меня возникают проблемы с получением данных на контроллер.

2. но почему бы и нет? Также вы никогда не должны передавать область действия в службу

3. loadRecordType — это способ получения данных в системе Salesforce с помощью удаленного взаимодействия javascript. Итак, если вы посмотрите на функцию извлечения в checkRecordType, это то, что вызывает loadRecordType . следовательно, он не может находиться за пределами checkrecordtype

4. это не имеет смысла. Не думайте, что вы правильно понимаете область действия javascript. Независимо от того, есть ли у вас другие проблемы, о которых нужно беспокоиться, и создание надлежащей чистой структуры поможет

5. также избавьтесь от использования success , оно устарело … привыкайте к использованию promise then()

Ответ №2:

Почему бы вам не попробовать переписать свою фабрику следующим образом:

 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 amp;amp; urlObject.addr == null) {
            displayCurrentLocation();
        }
        if (urlObject amp;amp; urlObject.aid amp;amp;
            urlObject.aid.startsWith(accPrefix)) {
            objModel = new RemoteObjectModel.Account();
        }
        if (urlObject amp;amp; urlObject.aid amp;amp;
            urlObject.aid.startsWith(leadPrefix)) {
            objModel = new RemoteObjectModel.Lead();
        }
        if (objModel == null amp;amp; urlObject.aid != null amp;amp; urlObject.addr == null) {
            displayReadingInformationErrorView();
        }
        if (objModel) {
            objModel.retrieve({
                where: {
                    Id: {
                        eq: urlObject.aid
                    }
                }
            }, loadRecordType);
        } else if ((urlObject.addr != null || urlObject.addr != '') amp;amp; (typeof urlObject.addr != "undefined")) {
            displayLocationBasedOnAddress(urlObject.addr);
        }

        function loadRecordType(err, records, event) {
            if (err) {
                displayReadingInformationErrorView();
            } else if (records != null amp;amp; 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;
}
  

Похоже, вы возвращаете свой заводской объект неправильным способом.

Комментарии:

1. хорошо, я переработал код и вставил. тогда теперь моя ошибка гласит userRecordFetchFactory.checkRecordType(…).then не является функцией

2. .then подразумевает, что ваш клиент ожидает обещания. Просто из краткого обзора checkRecordType не похоже, что возвращается обещание.

Ответ №3:

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

    custRec.checkRecordType = function (urlObject) {
        function loadRecordType(err, records, event) {
            if (err) {
                displayReadingInformationErrorView();
            } else if (records != null amp;amp; 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 amp;amp; urlObject.aid
            amp;amp; urlObject.aid.startsWith(accPrefix)) {
            objModel = new RemoteObjectModel.Account();
        }
        if (urlObject amp;amp; urlObject.aid
            amp;amp; urlObject.aid.startsWith(leadPrefix)) {
            objModel = new RemoteObjectModel.Lead();
        }

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