Я только что начал с ngJS.
Я нашел способ привязать objects
службы к контроллерам.
Я хотел бы знать, что это хорошая практика для достижения этого или есть рекомендуемый способ сделать это?
Я также хотел бы знать, почему это возможно только для objects
а не для properties
?
Вот моя скрипка. В глубине объяснения приветствуются.
Благодарю.
Прочтите эту 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 обертывает примитив строки. Все примитивы неизменяемы.
Фактически, вы привязали только свойства области к представлению, а затем эти свойства были инициализированы значениями свойств службы. Ваш код с некоторыми изменениями:
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/