1

object のオブジェクトの子に id があることに気付きましたが、オブジェクト変数を取得しようとしたときにそれが必要だったわけではありません。object の object のどのストアが欲しかったのですが、id しか見つかりませんでしたか?

たとえば、シーン管理を使用してオブジェクトを保存およびロードし、簡単にアクセスできるようにしました。

{ x:0, y:0, z:0, prams:{高さ:0,幅:0} }

保存の結果は、データを確認したときに異なることがわかりました。

{ x:0, y:0, z:0, prarms:#randomids }

uuid を使用してオブジェクトが一致する場合は、set と put を使用しました。それがどのように機能するかについて少し助けが必要です。オブジェクト データ全体を取得したいが、gundb オブジェクト ID は取得したくない。


set の部分的に機能するコードを取得し、データ オブジェクトを部分的に機能させるように管理します。こちらは簡易版の設定方法。

//console.log("saving object data????");
        this.check_gunsceneobj(obj['uuid'],(bfind,id)=>{
            //console.log("....CALLS");
            var gscene = this.gun.get('scene');
            //check child keys var is object to put var
            function gunObjectAssign(_gun, _obj){
                for(var i in _obj){
                    if(typeof _obj[i] == 'object'){
                        console.log(i);
                        //pathing for object child of object
                        _gun.path(i).put(_obj[i]);
                        gunObjectAssign(_gun.path(i),_obj[i]);
                    }
                }
            }
            if(bfind){
                console.log("set object scene[update]");
                if(id !=null){
                    console.log(id);
                    gscene.path(id).put(obj);
                    gunObjectAssign(gscene.path(id),obj);
                }
            }else{
                console.log("save object scene[insert]");
                //console.log(obj);
                gscene.set(obj);
            }
            console.log("object save?");
        });

ここでオブジェクトを取得します。

function gunObjDataAssign(self,data){
                    for(var i in data){
                        if(typeof data[i] === 'object'){
                            if(data[i] !=null){
                                var id = data[i]['#'];
                                data[i] = {}; //clear id hash
                                self.get(id).val((objdata)=>{
                                    delete objdata._;
                                    data[i] = objdata;
                                    gunObjDataAssign(self,objdata);
                                });
                            }
                        }
                    }
                }

                Gun.chain.valueobj = function (cb, opt) {
                  return this.val(function (val, field) {
                      if(val !=null){
                          delete val._;
                      }
                      gunObjDataAssign(this,val);
                      cb.call(this, val, field);
                  }, opt);
                };

                Gun.chain.liveobj = function (cb, opt) {
                  return this.on(function (val, field) {
                    delete val._;
                    gunObjDataAssign(this,val);
                    cb.call(this, val, field);
                  }, opt);
                };

                Gun.chain.eachobj = function () {
                  var each = this.map();
                  return this.valueobj.apply(each, arguments);
                };

完全にテストしていません。しかし、シーンオブジェクトにプッシュすると、更新を検出しようとはしませんでした。

スニペットのサンプルコードを使用。

4

1 に答える 1

0

私があなたの質問を正しく理解していれば...おそらくこのプラグインを使用したいと思うでしょう:

https://github.com/gundb/synchronous

gun.get('player').sync({}, {}, function(player){
  // player updated!
  console.log("Full object, not just pointers:", player);
})

ドキュメントの差分とパスを提供するhttps://github.com/gundb/onwardもあります。

これは役に立ちますか?お知らせいただければ、必要に応じて回答を修正します。

于 2016-12-27T07:58:13.600 に答える