5

$http.getAngularJS での複数のソースからの起動について質問があります。以下のコードは非常に単純です$scope.test。HTML の 1 つのボタンのクリック ハンドラである関数があります。これ$http.getは正常に動作します。次に$http.get、サーバーからデータを取得し、基本的なプリミティブ チャートを作成します。非常にシンプルで、これも機能します。$http.get次に、すべてのチャート ノードにボタンを追加し、ボタン ハンドラーに別の呼び出しを実行したいと思います。しかし、これはうまくいきません!

コードは次のとおりです。

$scope.test = function () {
    console.log('Klic na ID 1');
    $scope.commonController.getData('orgunit/1?jsonDepth=3')
        .success(function(workpositionData,status,headers,config) {
            console.log('Klic na ID 1 OK');
            $scope.workPositions = workpositionData.workPositions;
        }).error(function(data,status,headers,config) {
            commonController.error('Pri branju delovnih mest je prišlo do napake: '+data.description);
        });
};


var options = new primitives.orgdiagram.Config();    
var itemB, itemC, itemD, itemE;
var rootItem = new primitives.orgdiagram.ItemConfig();

options.rootItem = rootItem;
options.cursorItem = rootItem;
options.hasSelectorCheckbox = primitives.common.Enabled.True;

var buttons = [];
buttons.push(new primitives.orgdiagram.ButtonConfig("add", "ui-icon-folder-open", "Add0"));     
options.buttons = buttons;

options.onButtonClick = function (e, data) {
    console.log('Klic na ID '+data.context.id);
    $http.get('proxy/api/orgunit/' + data.context.id + '?jsonDepth=3')
    .success(function(workpositionData,status,headers,config) {
        console.log('Klic na ID '+data.context.id + ' OK');
        $scope.workPositions = workpositionData.workPositions;
    }).error(function(data,status,headers,config) {
        commonController.error('Pri branju delovnih mest je prišlo do napake: '+data.description);
    });                 
};

$http.get('proxy/api/orgunit/tree?jsonDepth=2')
.success(function(orgUnitsData,status,headers,config) {
    console.log('Reading orgunit tree ok');

    rootItem.title = orgUnitsData.orgUnits[0].title;
    rootItem.description = orgUnitsData.orgUnits[0].description;        
    rootItem.id = orgUnitsData.orgUnits[0].id;
    rootItem.hasSelectorCheckbox = false;
    rootItem.image = "http://www.basicprimitives.com/demo/images/photos/a.png";

    $scope.addItems(rootItem, orgUnitsData.orgUnits[0].subordinates, 0);
    jQuery(".basicdiagram").orgDiagram(options);


}).error(function(data,status,headers,config) {
    console.log('Reading orgunit not ok');
}); 

このチャートを作成するための多くの組み合わせ(ディレクティブ、個別のテンプレートとコントローラーなど)を試しましたが、何も機能しません。チャート ノートのボタンからの $http.get 呼び出しが起動しません (Chome 開発者ツールのネットワークには何もありません)。

しかし、ここで興味深いのは、テスト関数をもう一度実行すると (html ボタンをクリック)、テスト関数からの応答とチャート ボタンからの $http.get からの応答を取得することです。チャート ボタンからの $http.get 呼び出しが何かを待っているように見え、この何かが現れると起動します。

この問題の解決策を知っている人はいますか? シナリオ実行テスト、実行チャート ボタン機能、実行テストのコンソール出力は次のようになります (太字はチャート ボタン機能からのコンソール エントリ、太字はテスト機能からの非太字:

クリックなID 1 クリックなID 1 OK クリックなID 4 クリックなID 1 クリックなID 1 OK クリックなID 4 OK

これについて何か考えがある場合はお知らせください。 アップデート

https://github.com/angular/angular.js/issues/2794#issuecomment-18807158にあるソリューションで解決したので、呼び出し関数を $scope.$apply でラップしました。

$scope.$apply(function() {
    console.log('Klic na ID ' + data.context.id);
    $scope.commonController.getData('orgunit/' + data.context.id + '?jsonDepth=3')
    .success(function(workpositionData,status,headers,config) {
        console.log('Klic na ID ' + data.context.id + ' OK');
        $scope.workPositions = workpositionData.workPositions;
    }).error(function(data,status,headers,config) {
        commonController.error('Pri branju delovnih mest je prišlo do napake: '+data.description);
    });
});

よろしくお願いします

4

1 に答える 1

7

angular 1.1.4 以降では、angular ダイジェスト ループのコンテキストで $http を呼び出す必要があります。そうしない場合は$scope.$apply();、http 呼び出しの後に手動で呼び出すことができます。https://github.com/angular/angular.js/issues/2431#issuecomment-18566595を参照してください

于 2013-08-12T08:30:59.527 に答える