2017-03-10 9 views
1

これは何らかの方法で明白であればよろしいですが、anglejs docsやSOのようなものは似ていないようです。私は月ごとの見積もりを含むデータテーブルがあるアプリケーションを持っています。いくつかの素早い変更を行う方法として、推定値を1か月にドラッグアンドドロップすることができるものを実装しています。しかし、私は編集する必要がangularjsのネストされたリソース呼び出しの問題

function updatableResource(url){ 
    return $resource(url+":id/", {id: '@id'}, 
    { 
     'update': { 
     method:'PUT', 
     }, 
    } 
); 
} 

// in API definition file 
Estimate: foo.updatableResource('<URL>'), 

正常に動作し、私は通常

この場合、無問題で$updateまたは$saveを呼び出すことができます。

リソース:私は奇妙な問題に実行していますよ同時に2つのものを削除し、場合によっては削除することもできます。だから、私は第二をやる前に最初のものが成功したかどうかを知る必要があります。たとえば、見積もりなしで推定値を1か月から別の値に移動すると、最初に新しい見積もりを作成し、古い見積もりを削除します。

// source and target are objects that each contain an estimate from a different month. 

successFunc = function() { 
    source.estimate.$delete(
     function() { 
      <refresh stuff> 
     }, 
     function(rejection) { 
      alert("Unable to delete source estimate."); 
     } 
    ); 
}; 

errorFunc = function(rejection) { 
    <undo stuff> 
    alert("Unable to add money to target estimate."); 
}; 

// POST if new, PUT if updating 
if (isNewEstimate) { 
    target.estimate.$save(successFunc, errorFunc); 
} else { 
    target.estimate.$update(successFunc, errorFunc); 
} 

だから、このコードでは、見積作成/更新が正常に動作しますが、私は成功機能でソース推定上の任意の$リソースコールを呼び出すことはできません。私はこのような何かを行うことができると思います。私はエラーTypeError: source.estimate.$delete is not a functionを取得します。私はその関数の外で(ターゲットsave/update呼び出しと同じレベルで)呼び出すと動作します。私の研究では

は、私は一種の働いていた何かが見つかりました:

Api.Estimate.delete(source.estimate, 
<success and failure functions> 
... 

削除作業をしたが、何も他の削除を認識しているようだと私はために高価な手動の再クエリを実行する必要がありますそれは機能する。それがコールバック関数にあるので、スコープについて何か奇妙なことはありますか?オブジェクト自体に問題があると思われる、さらなるテストの際に

:それはその関数内で動作しませんなぜ私はちょうど...

EDITを把握することはできません

source.estimate 
Object 
    amount: 12345 
    date: "2017-02-25" 
    foo: "ABC" 
    id: 4715 
    bar: 987 
    baz: 123 
    __proto__: Object 

target.estimate 
d 
    $promise: undefined 
    $resolved: true 
    amount: 12345 
    date: "2017-03-25" 
    foo: "ABC" 
    id: 4716 
    bar: 987 
    baz: 123 
    __proto__: Object 

したがって、タイプdのターゲットは動作しているように見えますが、ソースオブジェクトの1つは標準オブジェクトだけです。ドラッグ方向を逆にすると、同じタイプの結果が得られます。ソースは常にオブジェクトで、ターゲットは常にdです(これは縮小されたJSのためです)。 $リソースオブジェクトの

+1

私は$ resourceを使用しているときにこの問題に遭遇しました...これは私がまっすぐな$ httpに切り替えた理由ですが、Console.log(source.estimate)には実際にその時点で値がありますか? – Dylan

+0

上記の編集で追加したように、オブジェクトは通常のように見えましたが(フィールドと値が期待されていたように)、実際のオブジェクトは異なります。 – zaknotzach

答えて

0

問題は、実際に私は、オブジェクトを取得するために使用したプラグインに関連することが判明しました。なんらかの理由でそれらのうちの1つをマングリングしていましたが、同じプロパティを持っていましたが、それは適切なものではありません$resourceこれは私がその関数を呼び出せなかった理由です。私はいくつかの機能を呼び出す順序のために、呼び出しレイアウトに関連しているように思えました。

0

インスタンスメソッドは約束されていると、標準的な連鎖方法で連鎖させることができます:

$scope.resource1 = updatableResource().get({id: 1}); 
$scope.resource2 = updatableResource().get({id: 2}); 

$q.all([$scope.resource1.$promise, $scope.resource2.$promise]) 
    .then(function(resArray) { 
    var res1 = resArray[0]; 
    var res2 = resArray[1]; 
    //Process results 
    //Return promise to chain 
    return $q.all([res1.$update(), res2.$update()]); 
}).then(function(resArray) { 
    var res1 = resArray[0]; 
    var res2 = resArray[1]; 
    //Do next thing 
}); 

約束の.thenメソッドを呼び出すと、新しい派生約束を返すので、それが容易に可能です約束を結ぶ。

任意の長さのチェーンを作成することは可能であり、約束は別の約束(それ以上解決を延期する)で解決することができるため、チェーンの任意のポイントで約束を一時停止/延期することができます。これにより、強力なAPIを実装することが可能になります。

— AngularJS $q Service API Reference - Chaining Promises

関連する問題