0

onclick のカスタム ディレクティブを作成しています。

//add favourite
app.directive('addfavourite',
    function ($rootScope, $http) {
        return function (scope, element, attrs) {
            element.bind('click', function () {
                //fire off $http
                $http({
                    method: 'GET',
                    url: attrs['url']
                }).success(function (data, status) {
                        $rootScope.user_favourites = data.user_favourites
                    });
            });
        };
    });

$http 呼び出しが実行されないという奇妙な問題が発生しています。コンソールにエラーはありません。何も起こりません。$http 呼び出しの前に関数内にアラートを配置すると、アラートが表示されますが、$http 呼び出しは行われません。私は何か間違ったことをしていますか?

どうもありがとう、ベン

4

4 に答える 4

0

angularJS 1.1.4 以降では、angular ダイジェスト ループのコンテキストから開始されていない場合、scope.apply を実行して http を開始する必要があります。そう :

//add favourite
app.directive('addfavourite',
    function ($rootScope, $http) {
        return function (scope, element, attrs) {
            element.bind('click', function () {
                //fire off $http
                $http({
                    method: 'GET',
                    url: attrs['url']
                }).success(function (data, status) {
                        $rootScope.user_favourites = data.user_favourites
                    });
                // Run the digest loop :
                $rootScope.$apply();
            });
        };
    });
于 2013-08-12T06:30:01.143 に答える
0

これを試して :

HTML

<input type="text" name="text1" url="/api/testurl" addfavourite="addfavourite" ng-model="test"/>

指令:

angularApp.directive('addfavourite',
    function($rootScope, $http) {
        return function(scope, element, attrs) {
            element.bind('click', function() {
                //fire off $http
                var u = attrs.url;
                $http({
                    method: 'GET',                  
                    url: u
                }).success(function(data, status) {
                    $rootScope.user_favourites = data.user_favourites
                });
            });
        };
    });
于 2013-08-12T05:44:11.560 に答える
0

提供されたコードだけでは何が問題なのかを判断するのは難しいため、次のようにエラー コールバックをアタッチしてみてください$http

$http({
    method: 'GET',
    url: attrs['url']
}).success(function (data, status) {
    $rootScope.user_favourites = data.user_favourites
}).error(function() {
    console.log('error')
});

エラー コールバックが呼び出された場合は、バックエンドがエラーで応答したことを意味します。エラー コールバックが呼び出されていない場合は、Chrome 開発者ツールの [ネットワーク] タブをチェックして、リクエストが行われたかどうかを確認できます。

于 2013-08-12T05:38:25.457 に答える
0

alert を success() に入れると、それが呼び出されることがわかります。ただし、エラーも処理することをお勧めします。

function ($rootScope, $http) {
    return function (scope, element, attrs) {
        element.bind('click', function () {
            //fire off $http
            $http({
                method: 'GET',
                url: attrs['url']
            }).success(function (data, status) {
                console.log('called');
                $rootScope.user_favourites = data.user_favourites
            }).error(function (data, status) {
                //error handling
            });
        });
    };
});

Demo

于 2013-08-12T05:35:52.697 に答える