2016-05-12 10 views
0

Я хочу, чтобы мои данные ответа HTTP были доступны контроллеру, чтобы отображать данные JSON в представлении через директиву («{{hint}}»). Однако, хотя в контроллере я могу регистрировать данные с завода, данные не будут предоставляться в работоспособном виде.

Когда то, что предоставляется фабрикой, зарегистрировано в контроллере, оно либо «неопределено», либо «не является функцией». Из кода ниже, «неопределенные» регистрируется»

Пожалуйста, помогите мне прямо мои обиды Как очистить это, чтобы использовать данные .get завода в контроллере

Контроллер:?

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 
    $log.log(QuizViewServ.getQuizData.quizQz); // <-LOGS AS "UNDEFINED" 
} 

}]); 

Фабрика:.

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }).then(function successCallback(response) { 
     console.log("inside successgul GET req"); 


     var quizQz; 
     quizQz = response.data.quizQs; 
     console.log(quizQz); 


    }, function errorCallback(response) { 

     alert("Trouble grabbing requested data.") 
    }); 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 
+0

Читать http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBThis большая статья. Благодарю. –

+0

.... Он неправильно использовал «пони», tho. : -/га. –

ответ

1

$ HTTP использует обещания вернуть результат При использовании QuizViewServ.getQuizData.quizQz вы ло gging ничего, так как он асинхронен.

На вашей фабрике верните обещание, а в вашем контроллере обработайте его.

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    return $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }) 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 

и в контроллере

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 

    QuizViewServ.getQuizData().then(function(result){ 
     $log.log(result.data); 
    }); 
} 

}]); 
+0

это делает работа. И именно по тем причинам, о которых вы говорили выше, которые я забыл. ОДНАКО, разве это не означает, что «бизнес-логика», итерация через объекты файла JSON, должна оставаться в контроллере? Ради «чистоты», должна ли эта логика храниться в Сервисе? --- Я не оспариваю ваш ответ, мне действительно любопытно. –

+0

Это зависит от того, нужно ли вам делать различные обработки с возвращенными данными. Если он несколько уникален для каждого контроллера, который его использует, вы должны сделать это в контроллере. Если несколько контроллеров нуждаются в одних и тех же данных, тогда сделайте обработку данных на заводе с помощью решения @Zohaib Ijaz, они оба действительны: P Таким образом, в принципе, у вас есть возможность делать оба пути, зависит от сценария и ваших личных предпочтений –

+0

Gotcha. Это имеет смысл. Да, я пробовал свои решения и решения @Zohaib Ijaz. Они оба работают, как вы сказали, в разных обстоятельствах. Благодарю. –

0

Вы должны Retrun эти данные. Это невозможно, как вы это делаете. Также quizQz propertyt является частным. Вы не можете получить к нему доступ даже после того, как это значение было установлено после ajax-вызова.

var getQuizData = function(){ 

return $http({ 
    method: 'GET', 
    url: '/assets/json.json' 
}).then(function successCallback(response) { 
    console.log("inside successgul GET req"); 


    var quizQz; 
    quizQz = response.data.quizQs; 
    console.log(quizQz); 
    return quizQz; 

    }, function errorCallback(response) { 

    alert("Trouble grabbing requested data.") 
    return ''; 
}); 

}

и в контроллере, получить данные, как это.

QuizViewServ.getQuizData().then(function(data){ 
    console.log(data); 
}); 
+0

Вы не можете вернуть данные в обещание. Вам нужно назначить его переменной, объявленной вне этого обещания, или вернуть объект для обработки ПРОМИС. Мой ответ - правильный способ извлечения данных из promis. Верните функцию, которая возвращает promis и обрабатывает его. : http://stackoverflow.com/questions/26854654/get-data-out-of-a-promise-instead-of-returning-a-promise –

+0

Я использую угловой в своем приложении для производства, и я знаю, мы можем вернуться данные, однако я пропустил, чтобы добавить оператор возврата до $ http() –

+0

. Тогда вам нужно будет смотреть результат с 'getQuizData()', который кажется плохим, если его случай, им любопытно, как вы это делаете –