[英]AngularJS: Bind service properties to controllers
我剛剛開始使用ngJS。
我已經找到了將服務objects
綁定到控制器的方法。
我想知道,這是實現此目標的良好做法,還是有推薦的方法來實現?
我也想知道為什么這僅適用於objects
而不適用於properties
?
這是我的小提琴 。 歡迎深入解釋。
謝謝。
閱讀此SO線程 。
variable
可以包含兩種類型的值之一:primitive values and reference values
。
Primitive values
是存儲在堆棧中的數據。Primitive value
直接存儲在變量訪問的位置。Reference values
是存儲在堆中的 對象 。- 存儲在變量位置中的
Reference value
是指向內存中存儲對象的位置的指針。- 基本類型包括
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);
};
});
因此,如果您更改了不會傳播到s1.name的c2控制器的$ scope.name值(例如,編輯視圖中的輸入框)。 而且,如果更改s1.name屬性(請參閱c2控制器中的$ scope.change方法),則此修改不會傳播到$ scope.name。
傳播服務屬性更改的一種方法是使用事件,即事件中來自服務的事件並在控制器中偵聽相同的事件(請參閱如何在AngularJs服務中創建自定義事件 )。
這是更新的jsfiddle: http : //jsfiddle.net/0j0mdjco/2/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.