2016-06-21 9 views
0

私はajax(get)リクエストを行い、角度の "jobList"サービスでjsonデータを使って約束を得ます。

次に、得られたデータでスコープを更新します。しかし、私の問題は、スコープ変数 'X'を更新するために、変数 "readX"(以下を参照)ごとに関数を作成する必要があることです。

次のコードの最後の関数のように、パラメータを追加する方法はありますか?

app.controller("JobListController", ['$scope', '$timeout', 'jobList', 
    function ($scope, $timeout, jobList) { 
     var readList = function (response) { 
      if (response) { 
       $timeout(function() { 
        $scope.list = response; 
        $scope.$apply(); 
       }); 
      } 
     }; 
     var readFamilies = function (response) { 
      if (response) { 
       $timeout(function() { 
        $scope.allFamilies = response; 
        $scope.$apply(); 
       }); 
      } 
     }; 
     var readRegions = function (response) { 
      if (response) { 
       $timeout(function() { 
        $scope.allRegions = response; 
        $scope.$apply(); 
       }); 
      } 
     }; 
     // !!! ----- HERE ------------- !!! 
     var readSomething = function (response, something) { 
      if (response) { 
       $timeout(function() { 
        $scope[something] = response; 
        $scope.$apply(); 
       }); 
      } 
     }; 

     jobList.get().then(readList); 
     jobList.getAll("allFamilies").then(readFamilies); 
     jobList.getAll("allRegions").then(readRegions); 
    }]); 

答えて

1

まずコールバック関数を簡略化することができます:コールバックが角内で発生した場合($httpを使用している場合)、$timeoutコールも$scope.$apply()コールも必要ありません。また、データが返された場合にのみ成功するようにサービスを記述し、失敗した場合には約束を拒否してください。ifを必要としないので、各コールバックが割り当てになる可能性があります。

約束を返す複数の通話を行っている場合は、通話をまとめて折り畳むことができますか?

$q.all([jobList.get(), jobList.getAll("allFamilies"), jobList.getAll("allRegions")]) 
.then(([list, families, regions]) => { 
    $scope.list = list; 
    $scope.allFamilies = families; 
    $scope.allRegions = regions; 
}); 

は、私がここにES6の構文を使用:それはあなたが簡単なコールバックの簡略表記を使用することができるようにbabeljsようなものを使用するようにビルド・チェーンをセットアップする価値は十分にあります。

あなたは本当にあなたがコールバックを生成するために工場を書くことができます(彼らはまだ並列に評価する)個別呼び出しを行うにしたい場合:

function assignToScope(name) { 
    return success; 

    function success(data) { 
     $scope[name] = data; 
    } 
} 
jobList.get().then(assignToScope('list')); 
jobList.getAll("allFamilies").then(assignToScope('allFamilies')); 
jobList.getAll("allRegions").then(assignToScope('allRegions')); 
0

これを試してみてください:

jobList.get().then(function (response) { 
    readSomething(response); 
    }); 

と関数readSomethingは入力のみのような応答を持つことができます。

1

データを取得する前に、必要なプロパティをscope変数に保存することができます。このような

何か:

$scope.property = "list"; 
jobList.get().then(readSomething); 

とあなたの関数は、今になってしまう:

var readSomething = function (response) { 
      if (response) { 
       $timeout(function() { 
        $scope[$scope.property] = response; 
        $scope.$apply(); 
       }); 
      } 
     }; 

PS:私はあなたにも、このような何かをするためにクロージャを使うことができますね

var readSomething = function (something) { 
      return function(response){ 
       if (response) { 
        $timeout(function() { 
         $scope[something] = response; 
         $scope.$apply(); 
        }); 
       } 
      } 
     }; 
+0

ので、2つの通話foreachの機能を実行する必要があり、変数を設定し、その後、関数を呼び出す... – Serge

+0

ええ、そうでなければ閉鎖方法を見て、私は私の答えを編集しました – gaurav5430

+0

どのように私はreadSomethingを使用することができますか? – Serge

関連する問題