2017-02-17 12 views
0

私の最高レベルのスコープに座って、ユーザー状態などの変数を保持できるサービスを作成する方法を見つけようとしています。AngularJsサービスバインディングが更新されない

今、私は数字を結合する簡単な例を作成しようとしています。しかし、私の角を強制的に動かさない限り、UI層は決して更新されません。

getNumber()という行を削除すると、htmlの番号が更新されないことがわかります。私は$ applyを呼び出すことを試みました、そして、それは私に1つが既に効力を発しているというエラーを与えます。

コード:

$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(プリミティブでもあります)に設定すると、ByRefではなくByValが実行されます。 SampleServiceの特性である任意オブジェクトを返すであろうように、参照を作成しSampleServiceオブジェクト自体$scopeに追加

。ここでは、サービスだけではなく、単一のプリミティブプロパティを参照の一例は以下のとおりです。

$scope.service = SampleService; 

{{service.number}} 

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

+0

私はこれを理解しましたが、$ scope.service = SampleServiceを保存するのではなく、SampleServiceからServiceオブジェクトを返す$ scope.State = SampleService.getData()を実行します。私たちの2つの似ていますが異なる方法には何らかの利点や欠点がありますか? –

+0

直接に設定し、 'getData()'を使用する唯一の違いは、 'getData()'関数を使うことによってサービスが何も返す必要がないことです。 – Claies

+0

この質問とコメントにお答えいただき、ありがとうございます。私は自分のデータを期待していることを文字通り知ることができる個人的な理由から、getDataアプローチが好きです。 –

0

数字、文字列、その他の基本的なタイプが値として渡され、ないの参照を、したがって、あなたが実際の数を取得している(すなわち7)とService.numberのアドレスではありません。

これを回避する方法は、オブジェクトを返すことだけです。これを代わりに使用してください。

+0

私はそれは私が、私は、変数サービスを返す私のserivceの下、でやって何だと思いました。コントローラでは、SampleServiceレベルでService内で公開されているSampleServiceのメソッドを呼び出すことができるためです。 –

関連する問題