1

「自分自身」のコレクションを含むモデルを含むコレクションで作業しています。例えば:

[{
     id: 1
     name: "John",
     children: [
         {
              id: 32
              name: "Peter",
              children: []
         },
         {
              id: 54
              name: "Mary",
              children: [
                  {
                      id:12,
                      name: "Kevin"
                  }
         ]
         },
     ]
}]

そのIDでKevinの「ユーザー」を取得したいとします。しかし、私が持っているのは「最初のコレクション」だけです。どうやってやるの??そして、コレクション内にユーザーを設定することについてはどうでしょうか。別のこと:彼からすべてのケビンの「親」を取得することは可能ですか?メアリーとジョンのように?

誰かがそのような問題に遭遇しましたか?

どうもありがとう

4

2 に答える 2

0

さて、私は今のところ問題を解決しているように見える User's Collection に再帰関数を作成しました (これの最良の点は、「深い」モデルを取得して変更するために使用できることです)。そのようなもの(誰かが提案を持っている場合は、自由に意見を述べてください):

findUserById: function(id) {
        var self = new Backbone.Collection(this.toJSON());

        return thisCollection(id, this);

        function thisCollection(id, collection, array) {
            var innerSelf = collection || this;
            var thisArray = array || [];
            for(var i = innerSelf.models.length; i--;) {
                if(innerSelf.models[i].get('id') == id) {
                    return [innerSelf.models[i]].concat([thisArray]);
                }else {
                    if(innerSelf.models[i].get('children').length > 0) {
                        thisArray.push(innerSelf.models[i]);
                        return thisCollection(id, innerSelf.models[i].get('children'), thisArray);
                    }else {
                        innerSelf.remove(innerSelf.models[i]);
                        return thisCollection(id, self, []);
                    }   

                }
            }
        }

    }

基本的に、2 つの項目を持つ配列を返します。1 つ目は探しているレコードで、2 つ目はこのユーザーの親の配列です。

于 2012-10-30T11:32:59.093 に答える
0

アンダースコア (これはバックボーンの依存関係であるため、既に持っています) は、この種の作業に最適です。その「マップ」機能 (バックボーンが Collection のメソッドとして提供する) をその検索機能と共に使用すると、次のことができます。

findPersonInPeopleCollection: function(nameWeAreLookingFor) {
    function findChildren(person) {
        if (!person.children) return [person];
        var children = _.map(person.children, function(child) {
            foundPeople.push(findChildren(child);
        })
        return _.flatten(children);
    }
    var allPeople = _.flatten(myCollectionOfPeople.map(findChildren));
    return _(allPeople).find(function(person) {
        return person.get('name') == nameWeAreLookingFor;
    }
}

親を最初に保存したい場合は、「Person」モデルクラスの初期化関数にロジックを追加できます。

var Person = Backbone.Model.extend({
    initialize: function() {
        _.each(this.get('children'), function(child) {
            child.parent = this;
        }, this);
    }
 });

コレクションの add メソッドをオーバーライドするか、人が追加された後にトリガーされるイベント ハンドラーをコレクションに追加することで、同様のことを行うこともできます。

于 2012-10-27T00:37:56.453 に答える