2017-02-17 69 views
0

我想找到一種方法來創建一個服務,可以坐在我的最高級別的作用域,並保存變量,如用戶狀態和其他任何。AngularJs服務綁定不更新

現在我正在嘗試創建一個簡單的示例,將數字綁定在一起。然而,UI層不會更新,除非我強迫我的角度再次獲得價值。

如果您刪除了說getNumber()的行,您會發現html上的數字永遠不會更新會發生什麼情況。我試着調用$ apply,並且給我一個已經生效的錯誤。

代碼:

$scope.update = function() { 
     SampleService.update(); 

//Forcing the number to be updated by asking the service to return it 
     $scope.number = SampleService.getNumber(); 

    }; 
//Why doesn't this force $scope.number to change as SampleServce.number changes? 
    $scope.number = SampleService.number; 

服務:

(function() { 
'use strict'; 

angular 
    .module('Services') 
    .service('SampleService', SampleService); 

SampleService.$inject = ['$http']; 

function SampleService($http) { 

    var Service = { 
     number: 0 
    }; 


    Service.update = function() 
    { 
     Service.number += 1; 
    }; 

    Service.getNumber = function() 
    { 
     return Service.number; 
    }; 

    return Service; 
} 
})(); 

回答

0

發生這種情況是因爲numberService的原始屬性。設置$scope.number(這是一個原語)等於SampleService.number(這也是一個原語)完成ByVal,而不是ByRef。

添加SampleService對象本身$scope將創建一個參考,正如返回任何對象是的SampleService性質。下面是引用服務,而不僅僅是單一的基本屬性的一個例子:

$scope.service = SampleService; 

{{service.number}} 

http://plnkr.co/edit/eWk8lZRa0dGIhd2I8h9t?p=preview

+0

我只是想通了,但不是存儲$ scope.service = SampleService我這樣做,$ scope.State = SampleService.getData()它從SampleService返回Service對象。我們兩種類似但不同的方法有什麼好處或缺點? –

+0

直接設置和使用'getData()'之間的唯一區別是通過使用'getData()'函數,您的服務不必返回任何內容。 – Claies

+0

謝謝你回答這個問題和評論中的問題。我喜歡我的getData方法,因爲我可以從字面上看到我期待我的數據。 –

0

數字,字符串等基本類型作爲值傳遞的,而不是引用,因此你得到的實際數量(即7)而不是Service.number的地址。

我只知道繞過這個方法是返回一個對象,並使用它的屬性。

+0

我認爲這就是我在我的serivce,在那裏我返回變量服務的底部做。因爲在控制器中,我可以在SampleService級別上調用服務內部公開的SampleService上的方法。 –