1

Backbone には、コレクション (オブジェクトの配列) の一部である個々のモデル (単一のデータセット) を抽出および更新するための優れた方法があります。

私は現在Angularを学んでおり、バインディング、フィルタリング、およびテンプレート化に圧倒されています(アンダースコアを好む)。それは多くのタスクを軽くします。

オブジェクトの配列から単一のオブジェクトを引き出す簡単な方法を見つけるのに苦労しています。私がオンラインで読んだことから、私のオプションは ng-repeat でフィルターを使用することです (何も「繰り返し」ていないので少し奇妙に思えます)、または jquery をプルして $.grep を使用します。別の方法独自のフィルターを作成するか、生の JavaScript で何かを記述することかもしれません。

配列から単一のオブジェクトを取り出すには、どの方法を使用しますか? バックボーンでは、コレクション内の各オブジェクトに一意の「id」プロパティがあり、Angular のビジネス データで同じパラダイムを使用していることに注意してください。それを行うためだけにjqueryやアンダースコアを取り込まないでください。

Angular メソッドが存在する場合はお詫び申し上げます。ドキュメントをナビゲートするのは少し難しいと思います。もしそうなら、それを使用している例を教えてください。どうもありがとう。

4

3 に答える 3

2

Backbone では、collection.findWhereUnderscore のfindメソッドにデリゲートするだけです。これは非常に簡単です。述語に一致する要素に到達するまで、コレクションをループするだけです。

それを行うためのヘルパー関数を書くだけです。例えば:

function find(array, attrs) {
  for (var i = 0, len = array.length; i < len; i++) {
    for (var key in attrs) {
      if (array[i][key] !== attrs[key]) {
        break;
      }
      return array[i];
    }
  }
  return null;
}

そして、次のように使用します。

findFirst(items, {id: 3});
于 2013-05-27T19:15:49.043 に答える
1

Lodash を試してみることをお勧めします。Lodashは私のお気に入りであり、私たちのチームは、Sails/Waterline およびクライアント プロジェクトで広く使用しています。特に、 をチェックしてください_.find()


一般的な使用法

var fluffyTheCat = _.find(cats, { name: 'fluffy' });


// assuming you've got "$scope.cats"

// you can do nice criteria-based lookups on a per-attribute basis:
_.find($scope.cats, { name: 'fluffy' });

// or do something lower-level:
// (return true to declare a match, false to keep going)
_.find($scope.cats, function (cat) {
  return cat.name.match(/^fluffy/i);
});

ドキュメント

http://lodash.com/docs#findから:

_.find(collection, [callback=identity], [thisArg])

コレクションの要素を繰り返し処理し、コールバックが truey を返す最初の要素を返します。コールバックは thisArg にバインドされ、3 つの引数で呼び出されます。(値、インデックス|キー、コレクション)。

コールバックにプロパティ名が指定されている場合、作成された「_.pluck」スタイルのコールバックは、指定された要素のプロパティ値を返します。

コールバックにオブジェクトが提供されている場合、作成された「_.where」スタイルのコールバックは、指定されたオブジェクトのプロパティを持つ要素に対して true を返し、それ以外の場合は false を返します。


_.where()1 つだけではなく、一致の配列を返すも参照してください。

于 2014-05-05T13:48:06.440 に答える
0

オブジェクトの各プロパティをループする必要がなかったので、つまり、id プロパティに対してのみ照合していることがわかったので、コントローラーにあるこの関数を思いつきました。$routeParams.item をコントローラーに渡すと呼び出されます。$routeParams.item は、取得したいオブジェクトの「id」を指定します。戻り値を $scope.dataIs プロパティに適用します。これは、バインドできるようになったことを意味します。

$scope.getDataIs = function(item){
    var dataIs;

    for (i = 0; i < $scope.data.length; i++) {
        if ($scope.data[i]['id'] == item) {
            dataIs = $scope.data[i];
            break;
        }
    }
    return dataIs;
}
于 2013-05-28T11:04:23.853 に答える