2014-09-20 3 views
0

Я искал в Google, но не могу найти информацию о том, как это сделать должным образом. Похоже, что все ответы на Google теперь устарели (используя более старые версии AngularJS).AngularJS: как выполнить метод в другом контроллере?

Я пытаюсь настроить два контроллера на моем модуле AngularJS. Например, первый контроллер обрабатывает запросы $ http GET. И второй контроллер отображает сообщение «успех» или «ошибка». Я хочу иметь возможность вызывать метод со второго контроллера с сообщением об успешности/ошибке, которое должно отображаться.

Или я должен использовать сервис/завод для этого? Я читал об услугах, но не могу понять, как сделать что-то вроде этой работы.

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

module.controller('ApiController', ['$scope', '$http', function ($scope, $http) { 
    $http.get('/api'). 
     success(function(data){ 
      // call AlertController('success') 
     }). 
     error(function(data){ 
      // call AlertController('failed') 
     }); 
}]); 

module.controller('AlertController', ['$scope', function ($scope) { 
    $scope.message = { 
     show_message: true, 
     type: 'info', 
     message: "Display message!" 
    }; 
}]); 

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

Кто-нибудь знает, как правильно это установить?

+3

u se service/factory –

+1

Возможный дубликат http://stackoverflow.com/q/11252780/2503246 –

+0

Hi, Вы можете написать самостоятельно и ввести его в контроллер с помощью модуля ввода: angular.module ('application', ['AlertModule']) После этого вы можете использовать его. Но есть такие вещи, как , это https://github.com/Foxandxss/angular-toastr. – Chrissx

ответ

1

Хорошо, давайте попробуем это - вы должны также проверить Injecting $scope into an angular service function()

Служба сообщений:

module.service('MessageService', function ($timeout) { 
    var messageQueue = []; 
    var DISPLAY_TIME = 5000; // each message will be displayed for 5 seconds 

    function startTimer() { 
     $timeout(function() { 
       // Remove the first message in the queue 
       messageQueue.shift(); 
       // Start timer for next message (if there is one) 
       if (messageQueue.length > 0) startTimer(); 
      }, DISPLAY_TIME); 
    } 

    function add(message) { 
     messageQueue.push(message); 
     // If this is the only message in the queue you need to start the timer 
     if (messageQueue.length==0) startTimer(); 
    } 

    function get() { 
     if (messageQueue.length==0) return ""; 
     else return messageQueue[0]; 
    } 

    return { add: add, get: get }; 
}); 

Вы все еще можете использовать эту ApiService, а также:

module.service('ApiService', ['$http', function ($http) { 
    return { 
     get: function(url) { 
      return $http.get(url); 
     } 
    }; 
}]); 

Ваш контроллер Поиск:

module.controller('SearchController', ['$scope', 'ApiService', 'MessageService', function ($scope, api, messages) { 
    api.get('/yelp'). 
    success(function(data){ 
     messages.add('success'); 
    }). 
    error(function(data){ 
     messages.add('failed'); 
    }); 
}]); 

предупреждающего сигнала Контроллер:

module.controller('AlertController', ['$scope', 'MessageService', function ($scope, messages) { 
    $scope.getMessage = function() { messages.get(); } 
}]); 

Так что в вашем HTML вы можете иметь:

<div ng-controller="AlertController"> 
    <div>{{ getMessage() }}</div> 
</div> 
+0

Эй, спасибо. Но я не думаю, что это ухватится за корень моего вопроса. Моя проблема в том, что я пытаюсь отделить модель от контроллера, поэтому я могу использовать данные этой модели в нескольких контроллерах. то есть. Я хочу нажимать/сохранять сообщения оповещений в объект очереди модели из SearchController, а затем извлекать/читать эти сообщения из AlertController, чтобы AlertController мог обновлять/отображать предупреждения (и т. Е. Через 5 секунд скрывать предупреждения один за другим -one, а затем обновить/удалить очередь сообщений, чтобы очистить старое сообщение). Но не уверен, как настроить службу, чтобы действовать как эта модель. – BuildTester1

+1

Хорошо, я отредактировал свой ответ, надеюсь, это поможет. – Constantinos

+0

Отлично! Именно то, что мне нужно было увидеть. Спасибо огромное! 1. Не понял, почему службы использовали return {}, но теперь я вижу, как это работает. 2. Не знал, что представление может использовать функцию вызова для вывода. – BuildTester1

0

вот как вы делаете автокрепеж

module.factory('appService', ['$window', '$http', '$q', function(win, $http, $q) { 
    return{ 
     backendcall: function(){ 
      var deferred = $q.defer(); 
      $http.get('/yelp'). 
       success(function(data){ 
        deferred.resolve(data); 
       }). 
       error(function(data){ 
        deferred.resolve(status); 
       }); 

      return deferred.promise; 
     } 
    } 
    }]); 

и контроллер будет так

module.controller('AlertController', ['$scope', 'appService', function ($scope, appService) { 
    appService.backendcall().then(function(response){ 
      $scope.message = { 
      show_message: true, 
      type: 'info', 
      message: "Display message!" 
     }; 
    }) 

}]); 
+0

Это действительно сбивает с толку. Можете ли вы объяснить, что происходит в вашем коде? – BuildTester1

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