9

$resourceプレゼンテーション層に入る前にクリーンアップする必要があるデータを API が常に返すものがあります。具体的には、Date オブジェクトを素敵な'/Date(...)/'形式で返す .NET です。

.query()orを呼び出すたびにコールバックを記述する必要はありません.get()。インスタンスのプロパティを更新する REST メソッドで呼び出されるコールバックを使用してリソースを拡張する方法、または$watch日付プロパティが変更されたときに発生するようなものを追加する方法はありますか? 基本的に、 this のすべてのインスタンスに対して発生する何か$resource

angular.module('myAppServices', ['ngResource'])
    .factory('Participant', ['$resource', function ($resource) {
        var res = $resource('api/url/participants/:id', { id: '@id' });

        // This obviously doesn't work, but something kinda like this?
        res.prototype.$watch(this.FieldName, function(newVal, oldVal) {
            if (needsCleaning(newVal.fieldName) {
                this.FieldName = cleanupField(newVal);
            }
        };
    });
4

3 に答える 3

8

これを行う簡単な方法は、$resource後処理を行いたい既存のメソッドを独自のメソッドで上書きすることです。例については、以下のコードとコメントを参照してください。

angular.module('myAppServices', ['ngResource'])
    .factory('Participant', ['$resource', function ($resource) {
        var res = $resource('api/url/participants/:id', { id: '@id' }, {
            // create aliases for query and get to be used later
            _query: { method: 'GET', isArray: true },
            _get:   { method: 'GET' }
        });

        // redefine the query method
        res.query = function() {
            // call the original query method via the _query alias, chaining $then to facilitate
            // processing the data
            res._query.apply(null, arguments).$then(function(res) {
                var data = res.data;
                // do any processing you need to do with data here
                return data;
            });
        };

        // redefine the  method
        res.get = function() {
            // call the original get method via the _get alias, chaining $then to facilitate
            // processing the data
            res._get.apply(null, arguments).$then(function(res) {
                var data = res.data;
                // do any processing you need to do with data here
                return data;
            });
        };

        return res;
    });

またはParticipantを介し​​て、コードで現在使用しているのと同じ方法で使用します。チェーンされた $then ハンドラーで返すデータは、 によって返される promise を解決するために使用されます。Participant.query()Participant.get()$resource

于 2013-04-05T20:00:12.013 に答える
0

私が行った方法は、モジュールにサービスを追加することでした:

angular.module('keeniolab', ['ngResource']).
factory('KeenIO',function ($resource) {
    // factory implementation
}).service('KeenModel', function (KeenIO) {
    var KeenSession = function () {
        this.data = {};
    };

    KeenSession.prototype.fetch = function (query) {
        var self = this;

        KeenIO.get(query, function (result) {
            self.data = result;
        });
    };

    return new KeenSession();
});

これで、コレクションを簡単に監視できます。

$scope.$watchCollection(function () {
    return KeenModel.data;
},
function (value) {
    // code here
});

サービス モデルを使用した Keen.IO リソース ファクトリ

于 2013-06-06T12:47:59.267 に答える