7

MongoDB、Angular、Express、および Node (MEAN スタック) を使用してアプリケーションを構築しています。

MEAN.JS ジェネレーターを使用してアプリケーションを足場にしました。

記事モジュールを参考にします。

記事のコレクションに 7000 件のレコードがあり、各レコードに日付が関連付けられているとします。テーブル内のレコードを表示するためにページをロードするたびに 7000 レコードすべてをメモリにロードするのは非効率的であり、そのためにひどいパフォーマンスの低下が見られます。このため、(1 か月前) から (1 年後) の範囲の日付のレコードのみを読み込み、テーブルに表示したいと考えています。現在、次の方法でこれを行うことができます。

私の article.client.controller.js では:

$scope.find = function() {
        $articles = Articles.query();
};

...そして私のarticles.server.controller.jsでは:

var now = new Date();
var aYearFromNow = new Date(now.getTime() + 86400000*365); //add a year
var aMonthAgo = new Date(now.getTime() - 86400000*30); //subtract roughly a month

exports.list = function(req, res) { Article.find().where('date').lt(aYearFromNow).gt(aMonthAgo).sort('-created').populate('user', 'displayName').exec(function(err, articles) {
        if (err) {
            return res.send(400, {
                message: getErrorMessage(err)
            });
        } else {
            res.jsonp(articles);
        }
    });
};

問題は、これが動的な方法ではないことです。言い換えれば、ユーザーがどれだけ前に、どれだけ前に見たいかを指定できるようにしたいのです。

サーバー コントローラのクエリ パラメータを変更するクライアント ビューの変数 (「aYearFromNow」や「aMonthAgo」など) にバインドするにはどうすればよいですか?

4

2 に答える 2

7

もう 1 つの方法は、次のようにクエリ メソッドで検索パラメーターを渡すことです。

 $scope.searchart = function() {
    Articles.query({start:$scope.startDate, end:$scope.endDate}, function(articles) {
        $scope.articles = articles;
    });
};

次に、サーバー側コントローラーで、次のようにクエリ文字列パラメーターを読み取ります。

exports.searcharticle = function(req, res) {
    Article.find().where('date').gt(req.query['start']).lt(req.query['end']).exec(function(err, articles) {
        if (err) {
            res.render('error', {
                status: 500
            });
        } else {
            res.jsonp(articles);
        }
    });
};

この方法では、追加のルートやサービスは必要ありません。

于 2014-11-10T12:01:28.270 に答える
3

これはおそらく最もクリーンな方法ではありませんが、新しいサービスを作成できます (または現在のサービスを編集していくつかのパラメーターを操作できます)。

.factory('ArticlesService2', ['$resource',
    function($resource) {
        return $resource('articles/:param1/:param2', {
            param1: '',
            param2: ''
        }, {
            update: {
                method: 'PUT'
            }
        });
    }
]);

次に、コントローラーで呼び出します:

$scope.findWithParams = function() {
    $scope.article = ArticlesService2.query({
        param1: $scope.aYearFromNow,
        param2: $scope.aMonthAgo
    });
};

バックエンドでは、ルートを準備する必要があります:

app.route('/articles/:param1/:param2')
    .get(articles.listWithParams)

バックエンド コントローラーに関数を追加します。

exports.listWithParams = function(req, res) {
    Article.find()
    .where('date')
    .lt(req.params.param1)
    .gt(req.params.param2)
    .sort('-created').populate('user', 'displayName')
    .exec(function(err, articles) {
        if (err) {
            return res.send(400, {
                message: getErrorMessage(err)
            });
        } else {
            res.jsonp(articles);
        }
    });
};

動作するはずですが、テストしていません。

于 2014-07-17T19:12:50.730 に答える