1

stackoverflow の angular js の $location.path に関する多くの問題を見てきましたが、どれも私の問題を解決しません。

app.js で以下のルートを定義しました。

angular.module(
    'hotPosts',
    [ 'hotPosts.filters', 'hotPosts.services',
            'hotPosts.directives',
            'hotPosts.controllers', 'ngRoute', 'ngSanitize' ]).config(
    [ '$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
        $routeProvider.when('/hot-posts', {
            templateUrl : 'gptarin/partials/hot-posts.jsp',
            controller : 'ListPostsCtrl'
        });
        $routeProvider.when('/list-users', {
            templateUrl : 'gptarin/partials/list-users.jsp',
            controller : 'ListUserCtrl'
        });
        $routeProvider.when('/edit-user/:userId', {
            templateUrl : 'gptarin/partials/edit-user.jsp',
            controller : 'EditUserCtrl'
        });
        $routeProvider.when('/create-user', {
            templateUrl : 'gptarin/partials/edit-user.jsp',
            controller : 'EditUserCtrl'
        });
        $routeProvider.otherwise({
            redirectTo : '/hot-posts'
        });
        $locationProvider.html5Mode(false);

    } ]);

list-users.jsp パーシャルは、更新するレコードを選択できるユーザーのリストを表示します。更新ボタンをクリックすると、ngRoute はアプリを edit-user.jsp パーシャルに正常にルーティングします。$location.path('/list-users')ただし、そのページで [保存] ボタンをクリックすると、コントローラーで EditUserCtrlを使用したにもかかわらず、ルートが "/list-users" に変更されません。「[app_url]/?」にリダイレクトされます。

これが私のコントローラーです:

app.controller('EditUserCtrl', [
    '$scope',
    '$routeParams',
    'UserListFactory',
    'UserFactory',
    '$location',
    function($scope, $routeParams, UserListFactory, UserFactory,
            $location) {

        // callback for ng-click 'updateUser':
        // force it to refresh in the client
        $scope.saveUser = function() {
            if (angular.isUndefinedOrNull($scope.user)) {
                $scope.user = {};
                UserListFactory.create($scope.user, function() {
                    $location.path('/list-users');
                });
            } else if (angular.isUndefinedOrNull($scope.user.id)) {
                UserListFactory.create($scope.user, function() {
                    $location.path('/list-users');
                });
            } else {
                UserFactory.update($scope.user, function() {
                    $location.path('/list-users');
                });

            }
        };

        // callback for ng-click 'cancel':
        $scope.cancel = function() {
            $location.path('/list-users');
        };

        if ($routeParams.userId !== undefined) {
            $scope.user = UserFactory.show({
                userId : $routeParams.userId
            });
        }

    } ]);

更新機能 ( saveUser) は、ngResource を介してバックエンド サーバーに Restful 要求を行うサービスを使用します。サービスは正常に動作します (すべてのテストに合格しています)。

リソース アクションを呼び出すときに、成功のコールバック関数に $location.path を含めました。

私はキャッチしよう"$locationChangeSuccess""$locationChangeError"しましたが、この場合 a$locationChangeErrorがスローされることがわかりましたが、どのプロミスオブジェクトが拒否されてこのエラーが発生したのかわかりません。

どんな助けでも大歓迎です。

編集:

ここに edit-user.jsp パーシャルがあります

<div class="container-fluid">
    <div class="panel panel-primary">
        <div class="panel-heading">
            <h2 class="panel-title label">Edit User</h2>
        </div>
        <div class="panel-body">
            <form role="form" action="#" class="form-horizontal" ng-submit="saveUser()">
                <div class="form-group col-sm-11">
                    <div class="form-group">
                        <label for="accountId" class="col-sm-1 control-label">G+
                            Id: </label>
                        <div class="col-sm-4">
                            <input type="text" id="accountId" class="form-control"
                                ng-model="user.gpId"></input>
                        </div>
                        <label for="accountName" class="col-sm-2 control-label">Name:
                        </label>
                        <div class="col-sm-5">
                            <input type="text" id="accountName" class="form-control"
                                ng-model="user.name"></input>
                        </div>
                    </div>
                    <div class="form-group">
                        <div class="col-sm-9">
                            <input type="checkbox" id="showPosts" class="form-control"
                                ng-model="user.listPosts">ShowPosts</input>
                        </div>
                    </div>
                </div>
                <div class="form-group col-sm-1">
                    <div class="row">
                        <div class="col-sm-offset-1 col-sm-12 pull-right">
                            <button type="submit" class="btn btn-primary">Save</button>
                        </div>
                    </div>

                    <div class="row">
                        <div class="col-sm-offset-1 col-sm-12 pull-right">
                            <button type="button" class="btn btn-primary" ng-click="cancel()">Cancel</button>
                        </div>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>
4

3 に答える 3

5

まあ、すべてを試して数日後、インターネットで助けが見つからなかったので、この問題を修正しました。

数日もかからないように、この投稿を読んだ人と共有することにしました。

アプリをより注意深く追跡したところ、キャンセル ボタンが正常に機能し、ページ$location.pathに戻ることに成功したことがわかりました。/list-users

さらに調査したところ、[キャンセル] ボタンと [保存] ボタンの違いは、[キャンセル] ボタンが を使用するのng-clickに対し、[保存] ボタンのタイプを「送信」に定義したことであることがわかりました。

次に、フォームの関数呼び出しを提供する代わりに、[保存] ボタンに を使用し、そのタイプを「ボタン」に変更するように、html コードsaveUser()を変更しました。ng-submitng-click

これが私のhtml部分の作業バージョンです。js ファイルを変更する必要はありませんでした。

<form role="form" action="#" class="form-horizontal">
    <!--  ng-submit="saveUser()"> -->
    <div class="form-group col-sm-11">
        <div class="form-group">
            <label for="accountId" class="col-sm-1 control-label">G+ Id: </label>
            <div class="col-sm-4">
                <input type="text" id="accountId" class="form-control" ng-model="user.gpId"></input>
            </div>
            <label for="accountName" class="col-sm-2 control-label">Name: </label>
            <div class="col-sm-5">
                <input type="text" id="accountName" class="form-control" ng-model="user.name"></input>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-12">
                <label> 
                    <input type="checkbox" id="showPosts" ng-model="user.listPosts"> Show Posts
                </label> 
            </div>
            <div class="col-sm-12">
                <button type="button" class="btn btn-primary" ng-click="saveUser()">Save</button>
                <button type="button" class="btn btn-primary" ng-click="cancel()">Cancel</button>
            </div>
        </div>
    </div>
</form>

angular でのフォーム送信の仕組みと、 $location.path が失敗すると予想される promise オブジェクトの 1 つが発生する理由 (したがって、ルーティングでエラーが発生する理由) はまだわかっていません。

この点について明確なコメントをいただければ幸いです。

于 2014-08-06T23:20:21.193 に答える
0

Angular で 1 年以上の経験を積んだ後、最初の問題が何であったかがわかりました。Angular の ng-submit に関するドキュメントを読んで、次のことがわかりました。

さらに、フォームに action 、 data-action 、または x-action 属性が含まれていない場合に限り、デフォルトのアクション (フォームの場合はリクエストをサーバーに送信し、現在のページをリロードすることを意味します) を防ぎます。

コードを見ると、フォーム要素を定義するときに誤ってaction属性を追加したことが明らかです。

<form role="form" action="#" class="form-horizontal" ng-submit="saveUser()">

それを削除すると問題が解決します:

<form role="form" class="form-horizontal" ng-submit="saveUser()">
于 2016-01-04T01:21:02.203 に答える