AngularJS: привязка свойств сервиса к контроллерам

0

Я только что начал с ngJS.

Я нашел способ привязать objects службы к контроллерам.

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

Я также хотел бы знать, почему это возможно только для objects а не для properties?

Вот моя скрипка. В глубине объяснения приветствуются.

Благодарю.

Теги:
angularjs-scope

2 ответа

1
Лучший ответ

Прочтите эту SO-нить.

variable может содержать один из двух типов значений: primitive values and reference values.

  • Primitive values - это данные, которые хранятся в стеке.
  • Primitive value хранится непосредственно в месте, к которому обращается переменная.
  • Reference values являются объекты, которые хранятся в куче.
  • Reference value хранящееся в местоположении переменной, является указателем на местоположение в памяти, где хранится объект.
  • Примитивные типы inlcude Undefined, Null, Boolean, Number или String.

Основы

Объекты - это совокупности свойств. Свойство может ссылаться на object или primitive. Primitives are values, они не имеют свойств.

JavaScript имеет 5 примитивных типов данных: string, number, boolean, null, undefined. За исключением значений null и undefined, все значения примитивов имеют эквиваленты объектов, которые обертывают примитивные значения, например объект String обертывает примитив строки. Все примитивы неизменяемы.

0

Фактически, вы привязали только свойства области к представлению, а затем эти свойства были инициализированы значениями свойств службы. Ваш код с некоторыми изменениями:

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

myApp.service('s1', function() {
    this.Input = {
        name: 'John'
    };

    this.name = 'Doe';
});

myApp.controller('c1', function($scope, s1) {
    $scope.Input = s1.Input;
    $scope.name = s1.name;
});

myApp.controller('c2', function($scope, s1) {
    $scope.Input = s1.Input;
    $scope.name = s1.name;

    $scope.change = function() {
        console.log("s1.name = "+s1.name);
        s1.name = "ciao";
        console.log("s1.name = "+s1.name);
    };
});

Поэтому, если вы измените значение $ scope.name контроллера c2 (например, отредактируйте поле ввода в представлении), которое не распространяется на s1.name. И многое другое, если вы измените свойство s1.name (см. Метод $ scope.change в контроллере c2), эта модификация не распространяется на $ scope.name.

Способ распространения изменений в свойствах службы - это использование событий, то есть рост событий от обслуживания и прослушивание одних и тех же событий в контроллерах (см. Как создать настраиваемое событие в службе AngularJs).

Вот обновленный jsfiddle: http://jsfiddle.net/0j0mdjco/2/

Ещё вопросы

Сообщество Overcoder
Наверх
Меню