0

基本的なJSの質問、私は初心者です:)

2つの変数をfindRelatedRecords関数に渡します。この関数は、他の関連テーブルを照会し、データと呼ばれるオブジェクトの配列をアセンブルします。findRelatedRecordsには非常に多くの内部関数があるため、関数からデータ配列を取得するのに苦労しています。

現在のように、findRelatedRecords内でshowWinを呼び出しますが、showWinにジャンプせずに、findRelatedRecordsから直接データ配列を取得できるように変更したいと思います。

function findRelatedRecords(features,evtObj){
    //first relationship query to find related branches

    var selFeat = features
    var featObjId = selFeat[0].attributes.OBJECTID_1        
    var relatedBranch = new esri.tasks.RelationshipQuery();
    relatedBranch.outFields = ["*"];
    relatedBranch.relationshipId = 1; //fac -to- Branch
    relatedBranch.objectIds = [featObjId];
        facSel.queryRelatedFeatures(relatedBranch, function(relatedBranches) {
        var branchFound = false;
        if(relatedBranches.hasOwnProperty(featObjId) == true){
            branchFound = true;
            var branchSet = relatedBranches[featObjId]
            var cmdBranch = dojo.map(branchSet.features, function(feature){
                return feature.attributes;
            })
        }

        //regardless of whether a branch is found or not, we have to run the cmdMain relationship query
        //the parent is still fac, no advantage of the parent being branch since cmcMain query has to be run regardless
        //fac - branch - cmdMain - cmdSub <--sometimes
        //fac - cmdMain - cmdSub <-- sometimes

        //second relationship query to find related cmdMains            
        var relatedQuery = new esri.tasks.RelationshipQuery();
        relatedQuery.outFields = ["*"];
        relatedQuery.relationshipId = 0; //fac -to- cmdMain
        relatedQuery.objectIds = [featObjId];
        //rather then listen for "OnSelectionComplete" we are using the queryRelatedFeatures callback function
        facSel.queryRelatedFeatures(relatedQuery, function(relatedRecords) {
            var data = []           
            //if any cmdMain records were found, relatedRecords object will have a property = to the OBJECTID of the clicked feature
            //i.e. if cmdMain records are found, true will be returned; and continue with finding cmdSub records
            if(relatedRecords.hasOwnProperty(featObjId) == true){
                var fset = relatedRecords[featObjId]
                var cmdMain = dojo.map(fset.features, function(feature) {
                    return feature.attributes;
                })
                //we need to fill an array with the objectids of the returned cmdMain records
                //the length of this list == total number of mainCmd records returned for the clicked facility
                objs = []
                for (var k in cmdMain){
                    var o = cmdMain[k];
                    objs.push(o.OBJECTID)                       
                }

                //third relationship query to find records related to cmdMain (cmdSub)
                var subQuery = new esri.tasks.RelationshipQuery();
                subQuery.outFields = ["*"];
                subQuery.relationshipId = 2;
                subQuery.objectIds = [objs]
                subTbl.queryRelatedFeatures(subQuery, function (subRecords){

                    //subRecords is an object where each property is the objectid of a cmdMain record
                    //if a cmdRecord objectid is present in subRecords property, cmdMain has sub records
                    //we no longer need these objectids, so we'll remove them and put the array into cmdsub
                    var cmdSub = []
                    for (id in subRecords){
                        dojo.forEach(subRecords[id].features, function(rec){
                            cmdSub.push(rec.attributes)
                        })
                    }
                    var j = cmdSub.length;
                    var p;
                    var sub_key;
                    var obj;
                    if (branchFound == true){
                        var p1 = "branch";
                        obj1 = {};
                        obj1[p1] = [cmdBranch[0].Branches]
                        data.push(obj1)
                    }                        
                    for (var i=0, iLen = cmdMain.length; i<iLen; i++) {
                        p = cmdMain[i].ASGMT_Name
                        obj = {};
                        obj[p] = [];
                        sub_key = cmdMain[i].sub_key;
                        for (var j=0, jLen=cmdSub.length; j<jLen; j++) {
                            if (cmdSub[j].sub_key == sub_key) {
                                obj[p].push(cmdSub[j].Long_Name);
                            }
                        }
                        data.push(obj);
                    }
                    showWin(data,evtObj) <---this would go away
                })
            }
            //no returned cmdRecords; cmdData not available
            else{
                p = "No Data Available"
                obj = {}
                obj[p] = []
                data.push(obj)
            }
            showWin(data,evtObj) <--this would go away
        })
    })
}

電話をかけるだけでデータ配列にアクセスしたい

function findRelatedRecords(feature,evt){
    //code pasted above
}

function newfunct(){
    var newData = findRelatedRecords(feature,evt)
    console.log(newData)
}

これは可能ですか?

ありがとう!

編集

もう少し説明.....

Objectイベントリスナーを次のような関数に接続しています:

function b (input){
    dojo.connect(obj, "onQueryRelatedFeaturesComplete", getData);
    obj.queryRelatedFeatures(input);
    console.log(arr) //<----this doesn't work
}

function getData(relatedFeatData){
    var arr = [];
    //populate arr
    return arr;
}

したがって、obj.QueryRelatedFeatures()が完了すると、getDataが起動します。この部分は正常に機能しますが、関数bからarrにアクセスするにはどうすればよいですか?

4

1 に答える 1

1

編集後の更新:

このイベントがフックされている方法のため、イベントからデータを単純に返すことはできません。戻ると、Dojoはに接続されている次のメソッドを呼び出すことができonSelectionCompleteます。

実行すると、井戸のイベントによって実行/解雇されるinitずっと前に、 /値が表示されていました。この種のシステムを操作する唯一の方法は、1)すでに行っているようにメソッドを呼び出すか、2)カスタムイベント/メッセージを起動することです(技術的には、メソッドを呼び出すだけです)。findRelatedRecordsonSelectionCompleteundefinednull

このメソッドを使いやすくしたい場合は、そのスニペットをリファクタリング/抽出して、より小さな関数にしますが、多くの関数に含まれている必要があります。また、findRelatedRecordsメソッドの最後に出口点が1つだけになるように変更すると役立ちます。内部で定義された関数は、開始subTbl.queryRelatedFeatures()するのに最適な場所です。

申し訳ありませんが、この場合、Dojoが提供するものによって制限されます。

事前編集回答:

データを返すだけです。showWin呼び出しがある場所では、このリターンを使用してください。

  return {
    data: data,
    evtObj: evtObj
  }

そうすると、newfunctは次のようになります。

function newfunct(){
    var newData = findRelatedRecords(feature,evt);
    console.log(newData);
    console.log(newData.data);
    console.log(newData.evtObj);
}

その「データ」オブジェクトのみが必要な場合は、returnを単に。に変更しますreturn data;

また、ステートメントを終了するためにセミコロンの使用を開始します。

于 2012-04-17T20:53:37.307 に答える