0

HTML で ng-click イベントによって呼び出されるメソッドを設定しました。

<div ng-repeat="section in model.sections">
    <a ng-click="updateSection($index)">
</div>

次に、私のjavascriptファイルには、次のサービスがありました。

.factory('Sections', function($resource){
    return{
        onUnits: $resource('/api/sections/:uuid/units', {uuid:'@sectionUUID'}, {
            get: {method: 'GET', params:{uuid: '@uuid'}, isArray:true}
        }
    }
}

html から呼び出されるメソッドは次のとおりです。

$scope.updateSection = function(index){
    $scope.model.sections[index].sectionUnits = Sections.onUnits.get({uuid: $scope.model.sections[index].sectionUUID}
        ,console.log($scope.model.sections[index])
        );
    }

この更新が行われる前に、

$scope.model.sections[0].sectionUnits == ['d1','d2']

これは、このセクションに関連付けられているユニットの ID のリストです。このメソッドは基本的にunit、次のような実際のオブジェクトでこのリストを更新します。

.sectionUnits = [{unitUUID: 'd1',
                  materials: ['m1','m2','m3']
                  }, {... }]

私のブラウザでは、上記のコードは、section探していた更新されたオブジェクトを返します。すべてのunitオブジェクトはsection.

しかし、私が本当に望んでいたのはmaterials、この更新されたオブジェクト内のユニットに関連付けられたすべての ID のリストを受け取り、sectionそれらを取得するコールバックを実装することでした。

それを試してみて、代わりに次のコールバックがあると、sectionUnitsまだ ID だけのリストが表示されます。

$scope.updateSection = function(index){
    $scope.model.sections[index].sectionUnits = Sections.onUnits.get({uuid: $scope.model.sections[index].sectionUUID}
        ,console.log($scope.model.sections[index].sectionUnits)
        );
    }

私は多くの SO スレッドと元のドキュメントに目を通しましたが、この時点でちょっと立ち往生しています。

ありがとう!

4

1 に答える 1

1

私が最も多く遭遇したパターンは、リソース オブジェクトを作成してから、コールバックで割り当てを行うというものです。したがって、現在のupdateSections関数の代わりに、次のようになります。

$scope.updateSection = function(index) {
    Sections.onUnits.get(
        {uuid: $scope.model.sections[index].sectionUUID},
        function(results) {$scope.model.sections[index].sectionUnits = results}
    )
}

あなたのコードでは、の結果がGET実際には割り当てられていないと思います。そのため、元の ID 配列が返されます。

割り当てGETは、リソースが成功した場合にのみ発生することに注意してください。エラーを処理するには、別のコールバックが必要です。

また、サービスはシングルトンであることを忘れないでください。そのため、サービスを渡す場合は、変更しないように注意してください。変更しないとSections、どこでも変更されます。

セクションを取得した後にマテリアルを取得するようにリクエストを連鎖させたい場合は、割り当ての直後にコールバックでそれを行います。

$scope.updateSection = function(index) {
    Sections.onUnits.get(
        {uuid: $scope.model.sections[index].sectionUUID},
        function(results) {
            $scope.model.sections[index].sectionUnits = results;
            // Should contain some looping mechanism since results is an array.
            $scope.getMaterials(results);
        }
    )
}

コードに関するその他の注意事項:

  • リソースを取得するための最初のメソッド呼び出しに問題があるようです。sectionUnitsその時点で、オブジェクトは文字列の配列であると言いますが、updateSection()メソッド呼び出しは配列をオブジェクトとして参照しようとします。あなたはコンソールのプリントアウトを取得できると言っているので、うまくいくと思いますが、タイプミスをしただけです
  • sectionUnits オブジェクトを文字列の配列から配列オブジェクトに変更するのは悪い考えのようです。多分それを初期化し.sectionUnits = [{unitUUID:'d1'}, {unitUUID:'d2'}]ますか?
  • Restangularをご覧になることをお勧めします。これは、基本的にラップ$resourceして、もう少しユーザーフレンドリーにします。とても働きやすいと感じました。
于 2013-08-05T06:58:01.650 に答える