0

これを行う方法はたくさんあることは知っていますが、なぜこのアプローチが機能しないのですか?

var selected = this.collection.where({checked: true});

var mapped = _.map(selected, Backbone.Model.prototype.toJSON.call);

this.$el.html(this.template(mapped));

エラーはUncaught TypeError: undefined is not a function

もっと簡潔な方法はありますか?

編集これは私が望んでいたことをしました...

var mapped = _.invoke(selected, Backbone.Model.prototype.toJSON);

EDIT 2 @nikoshrが改善しました。

var mapped = _.invoke(selected, 'toJSON');
4

2 に答える 2

3

_.mapバージョン 1.5.1 のソース コードを見てください。

_.map = _.collect = function(obj, iterator, context) {
    var results = [];
    if (obj == null) return results;
    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
    each(obj, function(value, index, list) {
      results.push(iterator.call(context, value, index, list));
    });
    return results;
};

これは、 内の各オブジェクトについて、指定されていないコンテキストでselected終了することを意味しBackbone.Model.prototype.toJSON.call.callます。これは、おそらく望んでいるものではありません。

toJSON各モデルを呼び出す最も簡単な方法は、次を使用すること_.invokeです。

invoke _.invoke(list, methodName, [*arguments])
リスト内の各値に対して methodName で指定されたメソッドを呼び出します。

あなたのケースに適用:

var mapped = _.invoke(selected, 'toJSON');

そしてデモ

var c = new Backbone.Collection([
    {id: 1, checked: true},
    {id: 2, checked: false},
    {id: 3, checked: true}
]);
var selected = c.where({checked: true});

var mapped = _.invoke(selected, 'toJSON');
console.log(mapped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.3.3/backbone-min.js"></script>

于 2013-08-21T16:05:02.487 に答える
0

マッピングが期待どおりかどうかを確認し、Chrome デバッガーでブレークポイントを使用するか、console.log(mapped) を追加します。マップに問題がないように見える場合は、おそらくテンプレートに値を渡していない可能性があります。さらに問題がある場合は、モデル、コレクション、およびテンプレートの定義を投稿してください。ところで、this.template は関数です。デバッガーまたは console.log(typeof this.template) でもう一度確認してください。

于 2013-08-21T15:58:53.133 に答える