2017-01-09 7 views
0

私はAngularJSを初めて使用しており、以前はWPF MVVMの経験があります。さて、私は$ scopeと非常に混同しています。それはビューモデルのように見えます。関数を定義し、ng-change、ng-clickなどの角度指示を使って関数を接続することができます。しかし、その関数がUIに関連していない場合は、$ scopeにもそれらを添付しなければなりませんか? $ scopeでどのような関数を定義する必要がありますか?また、実際の実装をカプセル化するためにサービスを使用し、$ scopeのメソッドでサービスを呼び出すことを提案する記事をいくつか読んでいます。これは、http呼び出しをデカップリングすることができます。しかし、私はそれがあまりにも多くのサービスを作成し、サービスのいくつかは再利用されないと思う。何か案は?

答えて

1

$ scope。$ scope。$ eval()または$ scope($)を使用して使用できるメソッドとフィールドをバインドします$ apply()補間を使用するときに暗黙的に使用するメソッド{{itIsInterpolation}}またはng-あなたのhtmlコードのプレフィックス属性)。 メソッドは、HTMLレイヤーから呼び出すことができます。

しかし、MVCイデオロギーでは、サービス層に何らかの論理的なアクションを実行してから、何らかの結果を返す(レンダリングして$スコープに入れる)ようにコントローラを使用します。ここでも同じ。たとえば、次のように

angular 
 
    .module('myApp', []) 
 
    .factory('ItemService', ItemService) 
 
    .controller('ItemController', ItemController); 
 

 
function ItemService($http) { 
 
    return { 
 
    getAllItemCost: getAllItemCost 
 
    }; 
 
    
 
    function getAllItemCost() { 
 
    return $http.get('api/items) 
 
     .then(function (response) { 
 
     var items = response.data; 
 
     return items.map(item => item.price).reduce((a, b) => a + b); 
 
     }); 
 
    } 
 
} 
 

 
function ItemController(ItemService) { 
 
    $scope.itemsCost = 0; 
 
    
 
    $scope.updateItemsCost = function() { 
 
    ItemService.getAllItemCost() 
 
     .then(function (cost) { 
 
     $scope.itemsCost = cost; 
 
     }); 
 
    } 
 
}

1

サービスと工場を使用することは、コードを分離する場合には常に良いアイデアです。 2つのサービスが2つあると心配しないでください。 以下の操作を行うことができます。

1-残りのコールを処理するサービスを作成します。休憩の際には、このサービスが使用されます。このサービスは、データ、URL、メソッドなどの共通の入力を受け取り、アプリ全体のすべてのコントローラとサービスに共通して使用されます。

2ユーティリティ目的で工場を作成します。いくつかの計算を行い、コントローラに適切なデータを返すことができます

3-グローバル変数を格納するための定数を使用して、そのような変数への変更を1か所で行うことができます。

4-一部のサービスはカスタムディレクティブに固有のもので、他の目的には使用されません。

5-スコープには、htmlでアクセスできる関数を含めることができます。他の機能は、そのコントローラに専用にすることができます。

関連する問題