Хранение данных в $rootScope

Целесообразно ли хранить данные в $rootScope. У меня есть приложение Cordova, которое использует данные датчика, которые поступают каждые 100 мс. Чтобы использовать эти данные в нескольких контроллерах, я использую переменную $rootScope.sensorData, которая обновляется каждые 100 мс. Можно ли использовать его таким образом? Есть ли лучший способ сделать это?

Спасибо


person Pradeep Rajashekar    schedule 29.07.2016    source источник
comment
Это уже обсуждалось здесь - stackoverflow.com/questions/35345446/   -  person v1shnu    schedule 29.07.2016


Ответы (4)


Вы можете хранить его на заводе. В AngularJS factory является синглтоном, поэтому создается только экземпляр.

myApp.factory('SensorSrv', function SensorSrv() {
  var sensorData;
  return {
    setData: setData,
    getData: getData
  };

  function setData(data) {
    sensorData = data;
  }

  function getData() {
    return sensorData;
  }
});

Вы также можете использовать локальное хранилище, если хотите сохранить данные.

person Arun Ghosh    schedule 29.07.2016
comment
Использование factory для передачи данных между несколькими контроллерами - лучший способ, который я знаю. Но данные будут устанавливаться каждые 100 мс, что приведет к перегрузке памяти. Это повлияло на производительность даже больше, чем хранение данных в $rootScope. - person Pradeep Rajashekar; 29.07.2016

Я думаю, что не стоит использовать $rootScope во всей логике кода. На это есть много причин... Вместо этого вы можете создать вход в код в services. это более гибко... а также вы можете увидеть эту ссылку

Рекомендации по использованию $rootscope в приложении Angularjs?

person Gopinath Kaliappan    schedule 29.07.2016

Из официальных документов:

$rootScope существует, но его можно использовать во зло

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

Иногда есть части данных, которые вы хотите сделать глобальными для всего приложения. Для них вы можете внедрить $rootScope и установить для него значения, как и для любой другой области. Поскольку области наследуются от корневой области, эти значения будут доступны для выражений, прикрепленных к директивам, таким как ng-show, точно так же, как значения в вашем локальном $scope.

Конечно, глобальное состояние — это отстой, и вы должны использовать $rootScope экономно, как вы (надеюсь) использовали бы с глобальными переменными в любом языке. В частности, не используйте его для кода, только для данных. Если у вас возникает соблазн поместить функцию в $rootScope, почти всегда лучше поместить ее в службу, которую можно внедрить туда, где она нужна, и которую легче протестировать.

И наоборот, не создавайте службу, единственной целью которой является хранение и возврат битов данных.

--Часто задаваемые вопросы по AngularJS

person georgeawg    schedule 29.07.2016

Я рекомендую использовать app.value app.value('test', 20);, поскольку с помощью $rootScope вы предоставляете это значение всем службам, которые могут представлять угрозу безопасности. Используя value, вы можете убедиться, где вы хотите использовать эту переменную в соответствии с вашими требованиями.

person Vikash Kumar    schedule 29.07.2016