2013-04-26 3 views
37

Я пытаюсь понять концепцию фабрики и сервиса в угловом. У меня есть следующий код под контроллером

init(); 

    function init(){ 
     $http.post('/services', { 
      type : 'getSource', 
      ID : 'TP001' 
     }). 
     success(function(data, status) { 
      updateData(data); 
     }). 
     error(function(data, status) { 

     }); 

     console.log(contentVariable); 
    }; 
    function updateData(data){ 
     console.log(data); 
    }; 

Этот код работает нормально. Но когда я пересылаю $ http service на завод, я не могу вернуть данные обратно контроллеру.

studentApp.factory('studentSessionFactory', function($http){ 
    var factory = {}; 
    factory.getSessions = function(){ 
     $http.post('/services', { 
      type : 'getSource', 
      ID : 'TP001' 
     }). 
     success(function(data, status) { 
      return data; 
     }). 
     error(function(data, status) { 

     }); 
    }; 
    return factory; 
}); 

studentApp.controller('studentMenu',function($scope, studentSessionFactory){ 
    $scope.variableName = []; 
    init(); 
    function init(){ 
     $scope.variableName = studentSessionFactory.getSessions(); 
     console.log($scope.variableName); 
    }; 
}); 

Есть ли какие-либо преимущества использования завода, так как $ HTTP работает даже в контроллере

ответ

88

Цель двигая studentSessions обслуживание из вашего контроллера, чтобы достичь разделения проблем. Задача вашего сервиса заключается в том, чтобы знать, как разговаривать с сервером, а задача контроллера - переводить между данными просмотра и данными сервера.

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

studentApp.factory('studentSession', function($http){ 
    return { 
     getSessions: function() { 
      return $http.post('/services', { 
       type : 'getSource', 
       ID : 'TP001' 
      }); 
     } 
    }; 
}); 

studentApp.controller('studentMenu',function($scope, studentSession){ 
    $scope.variableName = []; 

    var handleSuccess = function(data, status) { 
     $scope.variableName = data; 
     console.log($scope.variableName); 
    }; 

    studentSession.getSessions().success(handleSuccess); 
}); 
+1

Спасибо Брайан. Теперь имеет смысл. Я получаю ошибку «missing» после ошибки списка свойств. Ошибка остается после закрытия добавления закрытой парантезы для возврата на заводской основе. –

+0

Оки зафиксировал часть скобки. Теперь код 'studentApp.factory ('studentSession', функция ($ HTTP) { возвращение { getSessions: функция() { возвращение $ http.post ('/ услуги', { типа: 'getSource', ID: 'TP001' }); } } }); 'Теперь появилась ошибка с сообщением' Ошибка b не является функцией'. У меня нет функции b. Любое предложение о том, что вызывает эту ошибку? –

+0

Спасибо. Я пропустил эту скобу. Что касается «b не является функцией», используете ли вы какую-то классификацию кода или uglification? –

8

первый ответ является большим, но, может быть, вы можете понять это:

studentApp.factory('studentSessionFactory', function($http){ 
    var factory = {}; 

    factory.getSessions = function(){ 
     return $http.post('/services', {type :'getSource',ID :'TP001'}); 
    }; 

    return factory; 
}); 

Тогда:

studentApp.controller('studentMenu',function($scope, studentSessionFactory){ 
     $scope.variableName = []; 

     init(); 

     function init(){ 
      studentSessionFactory.getSessions().success(function(data, status){ 
       $scope.variableName = data; 
      }); 
      console.log($scope.variableName); 
    }; 
}); 
+0

Похоже на хороший ответ, но '.success' теперь устарел, кажется, http://stackoverflow.com/questions/33531336/angularjs-ошибок успех-это-не-а-функция # 33531521. – SharpC

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