2017-05-15 5 views
0

私のアプリケーションには、コントローラで呼び出されるサービスがあります。このサービスは、オブジェクトの配列を送信します。私のコントローラは、返されるデータのすべてを必要とせず、代わりに必要なデータだけを取得したいと考えています。返されるオブジェクトの配列を構築して、必要なデータのみを含める方法はありますか?約束によって返されるデータの変更

例:上記の私の例で

$scope.information = []; 

var loadData = function() { 
    var promise = myService.getData(); 
    promise.then(function(data) { 
    $scope.information = data.Information; 
    }, 
    function (dataError) { 
    console.log(dataError); 
)}; 
}; 

、data.Informationこのように見えるオブジェクトの配列である:私のコントローラで

{ 
    id: 1, 
    name: 'joe', 
    age: '21', 
    hair: 'blue', 
    height: '70', 
} 

私は 'ID' を必要と '名前 'のプロパティではなく、他のプロパティです。必要なデータだけを取得する必要はありませんか?そして、$ scope変数を作成することで、不要な情報を含まないように、オブジェクト内にこのデータしか持たないので、フロントエンドが肥大化することはありませんか?

+0

コントローラーにあまりにも多くのデータを置くことによってフロントエンドがどのように肥大化するのかわかりません。 – Bergi

+0

@Bergi - このオブジェクトのリストが非常に長くなる場合、不要な多くの追加データをダウンロードするのではないですか?私の考えはフロントエンドを可能な限り軽く保つために必要なデータだけを検索することです。私は角度コントローラーを「フロントエンド」として含んでいます。この論理は正しいのではなく、価値がありませんか? – myLogicIsWrong

+0

データのダウンロードを防止するには、 'myService.getData'および/またはserversideコードを変更する必要があります。私たちに教えてください。 – Bergi

答えて

1

map操作をリストに適用したいようです。つまり、リスト内の各アイテムについて、リスト内のすべてのアイテムを何らかの形で変更したいとします。これを行うにはArray.prototype.mapを使用できます。参照のためにMDNドキュメントへのHere is a link

など。

$scope.information = data.Information.map(function(element) { 
    return { 
     id: element.id, 
     name: element.name 
    } 
}); 
1

この簡単なはずです - あなたがここで一つだ、これを達成するために多くのオプションがあります。

$scope.information = []; 

var loadData = function() { 
    var promise = myService.getData(); 
    promise.then(function(data) { 
    $scope.information = data.Information.map(function(d) { 
     return { 
     id: d.id, 
     name: d.name 
     }; 
    }); 
    }, 
    function (dataError) { 
    console.log(dataError); 
)}; 
}; 

(あなたは少しのまわりでそれを微調整する必要があるかもしれませんので、私はこのコードをテストしていない)

+1

'map'の中で' push'を使わないでください! – Bergi

+0

@Bergiに感謝します - 修正を感謝します! – Tamas

0

Tamasの回答は、「サービス」からフェッチされたデータをフィルタリングする良い例です。私が取り組んでいるアプリケーションでは、実際にはREST APIを備えたバックエンドサーバーである 'サービス'からのレコードのフィールドのいくつかを計算することは時々高価になることがあります。私たちは、その後、サービスを

var loadData = function() { 
    var promise = myService.getData({fields: "name,id"}); 
    promise.then(function(data) { 
    $scope.information = data; 
    }); 
    }, 
    function (dataError) { 
    console.log(dataError); 
)}; 
}; 

と同等のものをやって巻く、またはバックエンド、私たちのためにフィルタリングを行い、返送されたデータだけでは、我々が必要とする正確に何です。 この種のフィルタリングを実装する(またはサービスメンテナを実装するよう説得する)ことができれば、別の方法として考えることができます。

0

あなたはサービス内のデータをフィルタリングしたい場合:

app.service("myService", function("$http") { 
    this.getData() = function() { 
     return $http.get(url) 
      .then(function(response) { 
      return response.data; 
     }); 
    }; 
    this.informationGet = function() { 
     var promise = this.getData(); 
     var newPromise = promise.then(function(data) { 
      var information = data.Information.map(function(d) { 
       return { 
        id: d.id, 
        name: d.name 
       }; 
      }); 
      return information; 
     }); 
     return newPromise; 
    }; 
}); 

使用法:

var promise = myService.informationGet(); 
    promise.then(function(information) { 
    $scope.information = information; 
    }, 
    function (dataError) { 
    console.log(dataError); 
    throw dataError; 
)}; 

約束の.then方法にデータを返すことでは、1がに解決する新しい約束を作成し、返されるデータの値

関連する問題