#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
, оно устарело … привыкайте к использованию promisethen()
Ответ №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;
}