2016-05-03 3 views
1

Я новичок в Angularjs. У меня вопрос о дизайне контроллеров и обмене данными.Угловая конструкция контроллера js, передающая данные ответа http-ответа другому контроллеру

У меня есть первый частичный upload.html, который использует UploadCntrl для загрузки документа Word на сервер с использованием $http.post. Вызов сервера заключен в uploadService. На стороне сервера я просматриваю частоту появления списка слов в документе и возвращаю эту информацию в ответ на $http.post.

Назад в UploadCntrl, в случае успеха, я хочу, чтобы направить/показать вторую частичную report.html, которая использует AnalyseCntrl, чтобы показать ответную реакцию анализа ($http.post упоминалось выше) в табличной форме.

Как я могу поделиться аналитическим ответом в UploadCntrl с AnalyseCntrl?

Правильно ли это подходит для проектирования контроллеров?

ответ

0

Способ сделать это, чтобы создать сервис и ввести его в оба контроллера.

app.service("sharedService", function() { 
    return { 
     sharedObject: {data: null} 
    }; 
}); 

Теперь в каждом контроллере, что-то вроде этого:

app.controller("myController", ["$scope", "$http", "$filter", "storageService", function($scope, $http, $filter, storageService) { 

    // We don't need to put it on the $scope but it makes it available to the view 
    $scope.shared = storageService.sharedObject; 
    ... 
    // After the following line, the other controller will have access to 
    // storageService.sharedObject.myThing as well. Easy! 
    $scope.shared.myThing = "your thing"; 
    ... 
0

Обмен данными в AngularJS лучше всего сделать с помощью services или factories. Другим вариантом будет сохранение ответа внутри local storage браузера, а затем доступ к нему внутри AnalyseCntrl.

Так, что-то подобное внутри UploadCntrl:

anaylseAPI.sendToAnalyse(object).then(function (response) { 
localStorage.setItem("howMany", response.amount); 
}); 

А затем получить доступ к localStorage внутри AnaylseCntrl.

Другое решение использует услуги.

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

angular 
    .module('app', []) 
    .service('DataStore', DataStore); 

function DataStore() { 

    this.amount = 0; 

    return function(amountOf) { 
    this.amount = amountOf; 
    }; 
} 

Теперь inject служба в обоих контроллерах, и сохранить/получить данные из него.

+0

Цените все ответы. Благодарю. – user1580865

+0

Службы - это синглтоны, так что это вызовет любую проблему, когда сервисы будут совместно использоваться несколькими контроллерами для хранения ответа на запрос на отправку в случае множественных запросов/сценариев с несколькими пользователями/несколькими браузерами? – user1580865

0

Вы можете написать услугу angularjs, отвечающую за отправку вашего почтового запроса. В этой службе вы можете иметь переменную, сохраняющую ваш ответ, и предоставить метод getter для получения значения этой переменной.

Кроме того, вы можете предоставить функцию, которая берет ваш файл в качестве параметра и делает ваш запрос $http. Как только вы получите ответ своего сервера, вы назначаете значение ответа своей переменной и отправляете широковещательную передачу.

Радиопередача может быть что-то вроде этого

$rootScope.$broadcast('response-recieved'); 

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

Вы можете сделать это так:

$scope.$on('response-recieved', function() { 
    var myResponse = MyService.getResponse(); 
} 

Here вы можете найти пример того, как пользоваться услугой. Дайте мне знать, если это вам поможет.