2

そのため、私は基本的なBackbone.jsを使用して、基本的なユーザーマネージャーである簡単なデモページを作成しています。ユーザーの情報を作成(POST)する場合でも更新する(PUT)場合でも、同じ関数を実行します。POST要求とPUT要求の両方が成功します(つまり、「成功」関数を呼び出します)が、PUTコマンドのみがルーターをトリガーし、POST要求は、成功関数をトリガーする間、同じコード行をトリガーしません。

以下は私のイベントコードです。saveUser関数はPUT要求とPOST要求の両方を処理しますが、成功したルーターは、成功したPOST要求からではなく、成功したPUT要求からのみ起動されます(両方がデータベースの更新に成功した場合でも)。

events: {
            'submit .edit-user-form': 'saveUser',
            'click .delete': 'deleteUser'
        },
        saveUser: function (ev) {
            var userDetails = $(ev.currentTarget).serializeObject();
            var user = new User();
            reply = user.save(userDetails, {
                success: function (){
                    router.navigate('', {trigger: true});
                },
                error: function(){
                    $("#editError").toggle();
                    $("#editError").html("Error:<br/>"+reply.status+" : "+reply.statusText+"<hr/>");
                }
            });
            return false;
        },
        deleteUser: function (ev){
            $.ajaxSetup({
                headers: {
                    'method':"DeleteUser"
                }
            });
            reply = this.user.destroy({
                success: function (){
                    router.navigate('', {trigger: true});
                },
                error: function(){
                    $("#editError").toggle();
                    $("#editError").html("Error:<br/>"+reply.status+" : "+reply.statusText+"<hr/>");
                }
            })
            return false;
        }

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

    var Router = Backbone.Router.extend({
        routes:{
            'new': 'editUser',
            'edit/:id': 'editUser',
            '': 'home'
        }
    });
    var router = new Router();
    //ROUTES
    router.on('route:home', function(){
        alert("1");
        userList.render(),
        editUser.render({});
    });
    router.on('route:editUser', function(id){
        userList.render();
        editUser.render({id: id});
    });
    //NECESSARY
    Backbone.history.start();`

どんな助けでもいただければ幸いです!

ありがとう!

4

2 に答える 2

3

問題は、新しいユーザーを作成するときに、すでにURLにアクセスしていて、現在のページのURLと異なる場合""router.navigate(newUrl)のみトリガーされることです。newUrl

https://github.com/documentcloud/backbone/issues/652を参照してください。

修正するには、変更します

router.navigate('', {trigger: true});

Backbone.history.fragment = null; // Forces the current URL to be dirty
router.navigate('', {trigger: true}); // Now, Backbone thinks the new URL is different
于 2013-01-15T20:46:16.747 に答える
1

投稿するとき、現在のURLは「http://gocella.com/backbone/#」です。投稿した後、URLを変更しない「http://gocella.com/backbone/#」に移動します。イベントを起動しません。

ルーターは、URLが変更されたときにのみイベントをトリガーします。編集を押すと、URLが「http://gocella.com/backbone/#/edit/1」に変更され、トリガーが「http」に戻るため、更新から機能します。 ://gocella.com/backbone/# "

この問題にルーターを使用するというアプローチは、全体的に間違っていると思います。

[保存]をクリックしたときに、新しいモデルを作成するか、既存のモデルをフォーム値で更新してから、を使用するcollection.create(modelFromForm)か、を使用する場合はmodel.save、成功コールバックでそれをコレクションに追加します。

于 2013-01-15T20:48:58.863 に答える