2016-06-24 10 views
2

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

angular.module('flapperNews') 
    .factory('posts', ['$http', function($http) { 
    var o = { 
     posts: [] 
    } 
    o.getPosts = function() { 
     return $http.get('api/posts').success(function(data) { 
     return data 
     }) 
    }; 
    o.create = function(post) { 
     return $http.post('api/posts', post).success(function(data) { 
     o.posts.push(data); 
     }) 
    }; 
    return o 
    }]) 

Когда я console.log (o.getPosts()), то возвращается следующее:

Promise {$$state: Object} 
$$state 
: 
Object 
pending 
: 
undefined 
processScheduled 
: 
false 
status 
: 
1 
value 
: 
Object 
config 
: 
Object 
data 
: 
Array[6] 
0 
: 
Object 
_id 
: 
"576d4904f2aa867dadb7b286" 
link 
: 
"aaa" 
title 
: 
"nice weather in Australia" 
upvotes 
: 
0 
__proto__ 
: 
Object 
__defineGetter__ 
: 
__defineGetter__() 
__defineSetter__ 
: 
__defineSetter__() 
__lookupGetter__ 
: 
__lookupGetter__() 
__lookupSetter__ 
: 
__lookupSetter__() 
constructor 
: 
Object() 
hasOwnProperty 
: 
hasOwnProperty() 
isPrototypeOf 
: 

данные, которые я хотел находится под массив [6], который находится в состоянии $$, кто-нибудь знает, что это такое и как обычно извлекают эти данные? Данные должны быть переданы в мой контроллер, как так:

$stateProvider 
    .state('home', { 
     url: '/home', 
     templateUrl: 'views/posts.html', 
     controller: 'PostCtrl', 
     controllerAs: 'posts', 
     resolve: { 
     postPromise: ['posts', function(posts) { 
      console.log(posts.getPosts()) 
      return posts.getPosts(); 
     }] 
     } 
    }); 

Примечание: Это взято из интернет-учебника. Был бы очень признателен, если кто-то может пролить свет на это, поскольку я новичок на фабрике и т. Д. Текущий код ничего не возвращает моему взгляду, можете ли вы сказать мне, где я поступил неправильно?

Отредактировано/добавлено: Это реализация контроллера. Когда я console.log (posts.posts), он возвращает пустой массив []. Есть идеи?

angular.module('flapperNews') 



    .controller('PostCtrl', [ 
     '$scope','posts', 
     function($scope,posts){ 

      $scope.posts=posts.posts; 

     $scope.incrementUpvotes=function(post){ 
       post.upvotes+=1 
      } 

      $scope.addPost = function(){ 
       if(!$scope.title || $scope.title === '') { return; } 
       posts.create({ 
       title: $scope.title, 
       link: $scope.link, 
       }); 
       $scope.title = ''; 
       $scope.link = ''; 
      }; 


    }]); 

ответ

1

Как вы называете метод завода в своем контроллере? Вы делаете запрос $ http, который возвращает обещание.

Вы можете узнать о обещаниях здесь: http://andyshora.com/promises-angularjs-explained-as-cartoon.html.

Вкратце вы можете видеть обещания как функции, которые выполняются сразу, но возвращают данные в будущем (не сразу). Вам придется подождать, пока обещание «решает» получить данные. Вот почему хорошо переносить любой код, который нуждается в данных из обещания, в рамках самой функции обещания.

В вашем контроллер вы должны вызвать Фабричный метод (getPosts()) так:

posts.getPosts().then(function(response){ 

    $scope.news = response.data; <---here is where you get your data for your news. You cant not declare **$scope.data** outside this promise function because you will miss the data. 

}); 

Не забудьте впрыснуть ваш сообщений службы/завод в вашем контроллер следующим образом:

controller(['posts',function(posts){ ... }); 

Вы можете также получить данные в вашем маршрут так:

$stateProvider 
    .state('home',{ 
     url:'/home', 
     templateUrl:'views/posts.html', 
     controller:'PostCtrl', 
     controllerAs:'posts', 
     resolve:{ 
      postPromise: ['posts', function(posts){ 

       return posts.getPosts().then(function(response){ 

        return response.data 

       }); 

      }] 
     } 
    }) 

Затем в контроллер вы можете впрыснуть в postPromise так:

controller(['postPromise',function(postPromise){ ... }); 

Теперь вы можете присвойте данные переменной в контроллере следующим образом:

$scope.news = postPromise; 

Надеюсь, я ответил на ваш вопрос. Если я неправильно понял, дайте более подробную информацию или укажите код.

+0

Я следую за tute здесь: https: // thinkster.io/mean-stack-tutorial # wiring-all-up, но postPromise не был введен в какой-либо контроллер. Поэтому я предполагаю, что учебник не является полным. Извините, я объяснил неправильно, posts.getPosts() не был реализован ни в одном контроллере, он существует только под разрешенным режимом stateprovider, так что сообщения появляются автоматически при загрузке страницы. Я попробую все ваши предложения и посмотрю, как это происходит. Спасибо, кучи !! –

+0

Вам нужно ввести postPromise в свой контроллер ... у него есть данные, возвращенные с вашего почтового сервиса. Посмотрите на раздел ** «Окончание комментариев» ** в своем учебнике, затем посмотрите на 3-й и 4-й фиолетовые боксы, и вы увидите, что он вводит ** пост ** в контроллер. ** post ** - это не служба, но объект, содержащий данные, загруженные в маршрут, разрешает. :) – btinoco

+0

Я добавил код контроллера выше - только служебные «сообщения» были введены в соответствии с учебником, но не «postPromise». По-видимому, это так, что данные сообщений не выходят за рамки, а другие контроллеры могут использовать данные путем ввода служебных «сообщений». В разрешении кода: { postPromise: ['posts', function (posts), что является первым аргументом 'posts'? Я прочитал другие статьи, но этот аргумент всегда не учитывается. , Я не думаю, что я намерен внедрить службу «posts» и postPromise в контроллер. –

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