8

JSON $resource がある場合、取得したオブジェクトをより具体的なオブジェクトにキャストするにはどうすればよいでしょうか?

たとえば、今はオブジェクトの配列として返されますが、「Appointment」オブジェクトの配列として返されるようにして、その Appointment オブジェクトに関する質問に答えるいくつかのメソッドをその Appointment オブジェクトに持たせることができるようにします。例: この予定に関連するサービスはありますか? この予定は午前ですか、それとも午後ですか?

最初は、transformResponse フックが ngResource から機能すると思っていましたが、機能していないようです。そこからの戻りは、実際のオブジェクトではありません。その関数を使用すると、JSON 解析の前に実際のデータのみを変更できるようです。

最後に、これが適切な angularJS 手法であるかどうか疑問に思いますか? それとも、これらのヘルパー メソッドは、コントローラーまたは他のモジュールに表示され、処理対象のオブジェクトを受け入れる必要がありますか? それらをオブジェクトにまとめたほうがきれいだと思いますが、angularJSの経験があまりないことは認めます。

4

1 に答える 1

22

ファクトリを使用していて、関数を追加したい場合は、たとえば、関数を返されたアイテムのプロトタイプ ( DEMO )に追加できます。

app.factory('Appointment', ['$resource', function($resource) {
  var Item = $resource('appointments.json',{/*bindings*/},{/*actions*/});

  Item.prototype.hasServices = function() {
    if(this.services.length > 0) return true;
    else return false;
  };

  Item.prototype.partOfDay = function() {
    if(this.time.split(':')[0] > 12) return "afternoon";
    else return "morning";
  };

  return Item;

}]);

次に、コントローラーのリソースでアクセスします。

$scope.appointments = Appointment.query({}, function() {
    console.log($scope.appointments[0].partOfDay())
});

または、たとえば ng-repeat 内のビューで直接:

{{appointment.partOfDay()}}

最後の質問に答えるために、上記の解決策は適切な angularjs 手法だと思います。特定のリソース タイプに関連付けられた関数があるとすぐに、それらをそれぞれのリソース オブジェクトに直接追加するのが最善だと思います。リソースをパラメーターとして渡す必要があり、さらに関数が複数のコントローラーまたはスコープで使用される可能性がある場合、コントローラーでヘルパー関数を作成する必要があるのはなぜですか?!

于 2013-08-18T16:19:21.020 に答える