У меня есть два угловых контроллера:
function Ctrl1($scope) {
$scope.prop1 = "First";
}
function Ctrl2($scope) {
$scope.prop2 = "Second";
$scope.both = Ctrl1.prop1 + $scope.prop2; //This is what I would like to do ideally
}
Я не могу использовать Ctrl1
внутри, Ctrl2
потому что он не определен. Однако, если я попытаюсь передать это так ...
function Ctrl2($scope, Ctrl1) {
$scope.prop2 = "Second";
$scope.both = Ctrl1.prop1 + $scope.prop2; //This is what I would like to do ideally
}
Я получаю ошибку. Кто-нибудь знает как это сделать?
дела
Ctrl2.prototype = new Ctrl1();
Также не удается.
ПРИМЕЧАНИЕ. Эти контроллеры не вложены друг в друга.
javascript
angularjs
angularjs-controller
dopatraman
источник
источник
Ответы:
Один из способов обмена переменными между несколькими контроллерами - это создать сервис и внедрить его в любой контроллер, где вы хотите его использовать.
Простой пример обслуживания:
Использование сервиса в контроллере:
Это очень хорошо описано в этом блоге (урок 2 и в частности).
Я обнаружил, что если вы хотите связать эти свойства с несколькими контроллерами, это будет работать лучше, если вы связываетесь со свойством объекта вместо примитивного типа (логическое, строка, число), чтобы сохранить привязанную ссылку.
Пример:
var property = { Property1: 'First' };
вместоvar property = 'First';
.ОБНОВЛЕНИЕ: Чтобы (надеюсь) сделать вещи более ясными, вот скрипка, которая показывает пример:
источник
both
его на функцию, и она будет вызываться / переоцениваться в процессе углового дайджеста. Смотрите эту скрипку для примера. Также, если вы связываетесь со свойством объекта, вы можете использовать его непосредственно в своем представлении, и оно будет обновляться по мере изменения данных, как в этом примере .getProperty()
функцию в область и использовать $ scope. $ Watch, как в этом примере . Надеюсь, эти примеры помогут!.service
вместо того,.factory
как описано в Angular Docs. Почему этот ответ так высоко оценивается, когда в документации используется другой метод?Мне нравится иллюстрировать простые вещи простыми примерами :)
Вот очень простой
Service
пример:А вот jsbin
И вот очень простой
Factory
пример:А вот jsbin
Если это слишком просто, вот более сложный пример
Также см. Ответ здесь для соответствующих комментариев лучших практик
источник
var _dataObj = {};
когда вы возвращаете прямую ссылку на него? Это не личное . В первом примере это можно сделать,this.dataObj = {};
а во второмreturn { dataObj: {} };
- бесполезное объявление переменных IMHO.--- Я знаю, что этот ответ не для этого вопроса, но я хочу, чтобы люди, которые читают этот вопрос и хотят обращаться с такими Сервисами, как Фабрики, чтобы избежать проблем с этим ----
Для этого вам нужно будет использовать Сервис или Фабрику.
Эти сервисы - ЛУЧШАЯ ПРАКТИКА для обмена данными между не вложенными контроллерами.
Очень хорошая аннотация на эту тему об обмене данными о том, как объявлять объекты. Мне не повезло, потому что я попал в ловушку AngularJS, прежде чем я прочитал об этом, и я был очень расстроен. Итак, позвольте мне помочь вам избежать этой проблемы.
Из "ng-book: полная книга по AngularJS" я прочитал, что ng-модели AngularJS, созданные в контроллерах как голые данные, НЕПРАВИЛЬНЫ!
Элемент $ scope должен быть создан следующим образом:
И не так:
Это потому, что рекомендуется (ЛУЧШАЯ ПРАКТИКА) для DOM (html-документ) содержать вызовы как
Это очень полезно для вложенных контроллеров, если вы хотите, чтобы ваш дочерний контроллер мог изменять объект из родительского контроллера ....
Но в вашем случае вам не нужны вложенные области видимости, но есть аналогичный аспект для передачи объектов из сервисов в контроллеры.
Допустим, у вас есть сервис «Фабрика», а в возвращаемом пространстве есть объект A, который содержит объект B, который содержит объект C.
Если из вашего контроллера вы хотите получить objectC в вашу область, было бы ошибкой сказать:
Это не сработает ... Вместо этого используйте только одну точку.
Затем в DOM вы можете вызвать objectC из objectA. Это лучшая практика, связанная с фабриками, и самое главное, она поможет избежать непредвиденных и неуловимых ошибок.
источник
Решение без создания Сервиса с использованием $ rootScope:
Для совместного использования свойств через контроллеры приложения вы можете использовать Angular $ rootScope. Это еще один вариант обмена данными, чтобы люди знали об этом.
Предпочтительный способ обмена некоторыми функциями между контроллерами - это службы, для чтения или изменения глобального свойства вы можете использовать $ rootcope.
Использование $ rootScope в шаблоне (доступ к свойствам с помощью $ root):
источник
Пример выше работал как шарм. Я только что сделал изменение на тот случай, если мне нужно управлять несколькими значениями. Надеюсь, это поможет!
источник
.factory
..service
Следует использовать « если вы определяете услугу как тип / класс» , как на docs.angularjs.org/api/auto/service/$provide#serviceЯ склонен использовать ценности, рад, что кто-нибудь обсудит, почему это плохая идея.
Затем введите значение согласно услуге.
Установить в ctrl1:
и доступ из ctrl2:
источник
В следующем примере показано , как передать переменные между братьями и сестрами контроллерами и принимать меры , когда изменяется значение.
Пример использования: у вас есть фильтр на боковой панели, который изменяет содержимое другого представления.
источник
Я хотел бы внести свой вклад в этот вопрос, указав, что рекомендуемый способ обмена данными между контроллерами и даже директивами - это использование сервисов (фабрик), как это уже было указано, но я также хотел бы предоставить Рабочий практический пример того, как это должно быть сделано.
Вот рабочий плункер: http://plnkr.co/edit/Q1VdKJP2tpvqqJL1LF6m?p=info
Сначала создайте свой сервис , который будет иметь ваши общие данные :
Затем просто вставьте его в свои контроллеры и получите общие данные в своей области:
Вы также можете сделать это для ваших директив , это работает так же:
Надеюсь, что этот практичный и чистый ответ может быть полезным для кого-то.
источник
Вы можете сделать это с помощью услуг или заводов. Они по сути одинаковы для некоторых основных различий. Я нашел это объяснение на сайте thinkster.io наиболее простым для подражания. Просто, точно и эффективно.
источник
Не могли бы вы также сделать свойство частью родительского объекта?
Я не говорю, что это правильно, но это работает.
источник
NOTE: These controllers are not nested inside each other.
. Если бы это были вложенные контроллеры или контроллеры, которые совместно использовали одного и того же родителя, это работало бы, но мы не можем этого ожидать.$parent
которую можно положиться, если этого можно избежать. Хорошо продуманный компонент многократного использования не должен знать о своих родителях.Ах, есть немного этого нового материала в качестве другой альтернативы. Это местное хранилище, и работает там, где работает угловой. Пожалуйста. (Но на самом деле, спасибо парню)
https://github.com/gsklee/ngStorage
Определите ваши значения по умолчанию:
Доступ к значениям:
Сохраните значения
Не забудьте добавить ngStorage в свое приложение и $ localStorage в свой контроллер.
источник
Есть два способа сделать это
1) Воспользуйтесь сервисом get / set
2)
$scope.$emit('key', {data: value}); //to set the value
источник
Второй подход:
HTML:
Для более подробной информации см. Plunker:
http://plnkr.co/edit/cKVsPcfs1A1Wwlud2jtO?p=preview
источник
Ctrl2
(слушатель) является дочерним контроллеромCtrl1
. Контроллеры братьев и сестер должны общаться через$rootScope
.Если вы не хотите оказывать услуги, вы можете сделать это так.
источник
Помимо $ rootScope и сервисов, существует чистое и простое альтернативное решение для расширения угла добавления общих данных:
в контроллерах:
Эти свойства принадлежат «угловому» объекту, отделены от областей и могут использоваться совместно в областях и службах.
1 преимущество в том, что вам не нужно вводить объект: они доступны где угодно сразу после вашего определения!
источник
window
объекту ... Если вы собираетесь загрязнять angular, почему бы просто не пойти дальше и не загрязнить объект окна ...