0

タイトルに記載されているように、Angular スキャナー/チェックアウト アプリケーションで説明が不十分なエラーが発生します。

/pulls ページを直接ロードすると問題なく、コンソール エラーは発生しません。次に、プルを選択して [表示] をクリックすると、/pull/:pull_id ページが読み込まれます。ここでも問題ありません。しかし、プルの /pulls リストに「戻る」へのリンクをクリックすると、問題が発生します。

以下のコード サンプルと、サンプルの下のコンソール ログ (素敵なデバッグ コメントを含む) を参照してください。

services.js ファイルに「pullsSvc」という名前のファクトリがあります。

app.factory("pullsSvc", ["$http","$q","$window","$routeParams", function ($http, $q, $window, $routeParams) {

var pulls;
var pull;
console.log('pullSvc Factory started');
function get_pulls() {
    console.log('pullSvc Factory get_pulls() started');
    var deferred = $q.defer();
    console.log('pullSvc Factory get_pulls() deferred');
    $http({
        method: 'post',
        url: 'ajax.php',
        data: $.param({
            'event' : 'get_pulls'
        }),
        headers: {'Content-Type' : 'application/x-www-form-urlencoded'}
    }).
    success(function(data) {
        if(data.success == true){
            console.log('pullSvc Factory get_pulls() success');
            pulls = data.pulls;
            deferred.resolve(pulls);
        }else{
            console.log('pullSvc Factory get_pulls() error 1');
            deferred.reject('Could not get pulls.');
        }
    }).
    error(function(data) {
        console.log('pullSvc Factory get_pulls() error 2');
        deferred.reject(error);
    });

    return deferred.promise;
}

function get_pull(pull_id) {
    .....
}
return {
    get_pulls: get_pulls,
    get_pull: get_pull,
};
}]);

それから私のcontrollers.jsに私は持っています

app.controller("ViewPullsCtrl", ["$rootScope", "$scope", "$http", "$q", "$route", "$routeParams", "$location", "$window", "$timeout", "$sessionStorage", "authenticationSvc", "auth", "pullsSvc", "pulls",
function ($rootScope, $scope, $http, $q, $route, $routeParams, $location, $window, $timeout, $sessionStorage, authenticationSvc, auth, pullsSvc, pulls) {
    console.log('This 1');
    $scope.userInfo = auth;
    $scope.pulls    = pulls;
    console.log('This 2');
    // FUNCTIONS
        $scope.logout = function () {
            authenticationSvc.logout()
                .then(function (result) {
                    $sessionStorage.$reset();
                    $location.path("/login");
                }, function (error) {
                     if(debug) if(debug) console.log(error);
                });
        };
        $scope.alert = function(message){
            if(message){
                console.log(message);
            }
        }
        $scope.consolelog = function(value){
            console.log(value);
        }
        $scope.setSelected = function(idSelected) {
            $scope.idSelected = idSelected;
        }
}
]);

そして、私のapp.jsルーティング(ngRoute)では、関連するビットは

    }).when("/pulls", {
    templateUrl: "views/pulls.html",
    controller: "ViewPullsCtrl",
    activetab: "pulls",
    url: "/pulls",
    resolve: {
        auth: function ($q, authenticationSvc) {
            var userInfo = authenticationSvc.getUserInfo();
            if (userInfo) {
                console.log('authSvc success');
                return $q.when(userInfo);
            } else {
                console.log('authSvc failure');
                return $q.reject({ authenticated: false });
            }
        },
        pulls: function ($q, pullsSvc) {
            var pulls = pullsSvc.get_pulls();
            if(pulls) {
                if(debug) console.log('pullsSvc success');
                return $q.when(pulls);
            } else {
                if(debug) console.log('pullsSvc failure');
                return $q.reject({ pulls: false });
            }
        }
    }

コンソール ログ

Route Change Start:
app.js (line 179)
Route Change Success:
app.js (line 187)
Object { name="$routeChangeSuccess",  targetScope=Scope,  defaultPrevented=false,  more...}
app.js (line 188)
Route Change Start:
app.js (line 179)
authSvc success
app.js (line 71)
pullSvc Factory get_pulls() started
services.js (line 189)
pullSvc Factory get_pulls() deferred
services.js (line 193)
pullsSvc success
app.js (line 81)
POST http://portal_dev.mycompany.com:8888/custom_scripts/mobile_scanner/ajax.php

200 OK
        1.24s   
angular.js (line 12011)
TypeError: domNode is null


return domNode.offsetWidth + 1;


angular.js (line 10490, col 7)
pullSvc Factory get_pulls() success
services.js (line 205)
Route Change Success:
app.js (line 187)
Object { name="$routeChangeSuccess",  targetScope=Scope,  defaultPrevented=false,  more...}
app.js (line 188)
This 1
controllers.js (line 142)
This 2

更新: に変更<a href...>して<a ng-href...>も違いはありませんでした。

angular.jsの12011行目はxhr.send(isUndefined(post) ? null : post); (v1.5.6)

Chrome のエラー ログが少し役に立ちます。angular.js:10490 Uncaught TypeError: Cannot read property 'offsetWidth' of null

4

1 に答える 1

0

これは、アプリの依存関係に含まれていた ngAnimate に何らかの形で起因する問題であることが判明しましたが、使用していませんでした (使用することを意図していましたが、変更を元に戻し、アプリの依存関係から削除されたことはありません)。

それがどのように、またはなぜ問題を引き起こしたのかはまだわかりません。ただし、依存関係から削除することで解決されます。

他の調査では、DOM がロードされる前にその一部にアクセスしようとすると、エラーが発生することが示唆されています。コントローラーで何もしなかったので、何をアニメーション化しようとしていたのかわかりません..しかし、何でも賢いです。

Google マップ API に関連しないこのエラーに関するトピックは存在しないため、質問を残して「解決策」を投稿することにしました。

なぜそれが起こっているのか、またはngAnimateを削除せずにそれを解決する方法に答えることができる場合は、いくつかの明確化を得たいと思っており、詳細な回答を解決策としてマークします.

于 2016-08-18T20:16:03.687 に答える