簡體   English   中英

AngularJS:將服務屬性綁定到控制器

[英]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是指向內存中存儲對象的位置的指針。
  • 基本類型包括UndefinedNullBooleanNumberString

基礎

對象是屬性的集合。 屬性可以引用objectprimitive Primitives are values ,沒有屬性。

JavaScript具有5種原始數據類型: string, numberbooleannullundefined 除了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM