0

AngularJS アプリケーションで奇妙なことが起こっています。オブジェクトの配列にバインドされたアンカータグのリストを持つビューがあります(ng-repeatリストをレンダリングするために使用しています)。各アンカー タグにはng-click、コントローラーのメソッドへのバインドがあります。方法は次のとおりです。

    $scope.onSiteSelected = function ($event, site) {
        $event.preventDefault();
        $.ajax({
            url: '/Site/GetSiteMap/' + site.Id,
            success: function (response) {
                if (response && response.length > 0) {
                    menuManager.setSiteMap($scope.$root.menu, response[0]);
                    var url = response[0].Children[0].Settings.Url;
                    $location.path(url);
                }
            }
        });
    }   

varはurl毎回正しい値に初期化されています。しかし、アンカータグを初めて$location.path(url)クリックすると何もせず、もう一度クリックするとターゲットの URL に移動します。

アップデート:

わかりました$http、次のようにサービスを使用して動作させました:

    $scope.onSiteSelected = function ($event, site) {
        $event.preventDefault();
        var address = '/Site/GetSiteMap/' + site.Id;
        $http.get(address)
            .success(function (response) {
                if (response && response.length > 0) {
                    menuManager.setSiteMap($scope.$root.menu, response[0]);
                    var url = response[0].Children[2].Settings.Url;
                    $location.path(url);
                }
            });
    }

またはを使用した場合、本当に違いがあります$,ajax$http? 2つは同じ意味で使えると思ったのですが…?

4

1 に答える 1

2

いいえ、それらを互換的に使用することはできませんが$.ajaxjQueryAngular$httpの http サービスです。

ほとんどの場合、角度のある方法でjQueryを使用する方法があるため、jQueryを使用したいという衝動に抵抗してください。

そうは言っても、Angular の世界の外で何かを行う場合 (ほとんどのコールバックは angular から発生しませんでした)、変更を適用して強制的にdigest循環させる必要があります。

$.doSth(function callback() {
    $scope.$apply(function () {
        // your actual code
    });
}); 

jQueryのバックグラウンドがある場合は、「AngularJSで考える」で最も投票された回答を読んでください。. これにより、代替手段がある場合に jQuery を使用することを避けることができます。

于 2013-03-10T12:35:13.060 に答える