2017-07-18 6 views
0

私はBackbone.jsを学んでおり、試用版プロジェクトとして少しのWordPressユーザー管理アプリケーションを作成しています。これまでのところ私のコードはすべてのWordPressユーザーのリストを表示し、アプリケーションに新しいユーザーを追加できるフォームを持っています。Backbone.jsを使用して保存時に更新を表示するには

これはうまくいきますが、新しいユーザーを追加するとユーザーのリストは自動的に更新されません。ページを更新して新しいユーザーを追加する必要があります。これは理想的ではなく、バックボーンの利点の1つを打ち負かします.js!

私はユーザーのためのモデルを持っているし、すべてのユーザーをコンパイルするコレクションを持っています。私はulにユーザーを出力するビューがあり、フォームをレンダリングするビューがあります。 .saveメソッドが新しいユーザーとのユーザー更新を含むビューと呼ばれるとき、コードをどのように動作させるのですか?それとも、これにアプローチする別の方法がありますか?

//define the model which sets the defaults for each user 
 
var UserModel = Backbone.Model.extend({ 
 
    defaults: { 
 
     "username": "", 
 
     "first_name": "", 
 
     "last_name": "", 
 
     "email": "", 
 
     "password": "", 
 
    }, 
 
    initialize: function(){ 
 
    }, 
 
    urlRoot: 'http://localhost/development/wp-json/wp/v2/users' 
 
}); 
 

 
//define the base URL for ajax calls 
 
var baseURL = 'http://localhost/development/wp-json/wp/v2/'; 
 

 
//function to define username and password 
 
function authenticationDetails(){ 
 
    var user = "myUserName"; 
 
    var pass = "myPassword"; 
 
    var token = btoa(user+':'+pass); 
 
    return 'Basic ' + token; 
 
} 
 

 
//add basic authorisation header to all API requests 
 
Backbone.$.ajaxSetup({ 
 
    headers: {'Authorization':authenticationDetails()} 
 
}); 
 

 
//create a collection which returns the data 
 
var UsersCollection = Backbone.Collection.extend(
 
    { 
 
     model: UserModel, 
 
     // Url to request when fetch() is called 
 
     url: baseURL + 'users?context=edit', 
 
     parse: function(response) { 
 
      return response; 
 
     }, 
 
     initialize: function(){ 
 
     } 
 
    }); 
 

 
// Define the View 
 
UserView = Backbone.View.extend({ 
 
    model: UserModel, 
 
    initialize: function() { 
 
     // create a collection 
 
     this.collection = new UsersCollection; 
 
     // Fetch the collection and call render() method 
 
     var that = this; 
 
     this.collection.fetch({ 
 
     success: function() { 
 
      that.render(); 
 
     } 
 
     }); 
 
    }, 
 
    // Use an external template 
 
    template: _.template($('#UserTemplate').html()), 
 
    render: function() { 
 
     // Fill the html with the template and the collection 
 
     $(this.el).html(this.template({ users: this.collection.toJSON() })); 
 
     return this; 
 
    }, 
 

 
}); 
 

 
var userListing = new UserView({ 
 
    // define the el where the view will render 
 
    el: $('#user-listing') 
 
}); 
 

 
NewUserFormView = Backbone.View.extend({ 
 
    initialize: function() { 
 
     this.render(); 
 
    }, 
 
    // Use an external template 
 
    template: _.template($('#NewUserTemplate').html()), 
 
    render: function() { 
 
     // Fill the html with the template and the collection 
 
     $(this.el).html(this.template()); 
 
     return this; 
 
    }, 
 
    events: { 
 
     'click .create-user':'addNewUser' 
 
    }, 
 
    addNewUser: function(){ 
 

 
     var newFirstName = $('.first-name').val(); 
 
     var newLastName = $('.last-name').val(); 
 
     var newEmail = $('.email').val(); 
 
     var newPassword = $('.password').val(); 
 
     var newUserName = newFirstName.toLowerCase(); 
 

 
     var myNewUser = new UserModel({username:newUserName,first_name:newFirstName,last_name:newLastName,email:newEmail,password:newPassword}); 
 
     console.log(myNewUser); 
 
     myNewUser.save({}, { 
 
      success: function (model, respose, options) { 
 
       console.log("The model has been saved to the server"); 
 
      }, 
 
      error: function (model, xhr, options) { 
 
       console.log("Something went wrong while saving the model"); 
 
      } 
 
     }); 
 
    } 
 
}); 
 

 
var userForm = new NewUserFormView({ 
 
    // define the el where the view will render 
 
    el: $('#new-user-form') 
 
});

+1

認証された呼び出しを管理するために 'ajaxSetup'を使用しないでください。代わりに、[あなたの利点にバックボーンの 'sync'関数を使う](https://stackoverflow.com/a/41991573/1218980)。 –

+1

['$(this.el)===こちら。$ el'](https://stackoverflow.com/a/40321584/1218980)。 –

+1

ビュー内の 'model:UserModel、'は役に立たない。このビューには、Modelコンストラクタは必要ありません。 –

答えて

2

すべてのバックボーン・オブジェクト(モデル、コレクション、ビュー)あなたが望むものに関連するだろうそのうちのいくつかのイベントを、投げます。モデルは.setメソッドが使用されたときにchangeイベントをスローし、コレクションはaddまたはupdateイベントをスローします...完全リストはhereです。

イベントが既にスローされていることがわかったら、そのイベントを聴いて反応することができます。例えば、listenToを使用する - あなたのビューのinitializeに、あなたが追加することができます。モデルは、あなたのコレクションに追加されるたびに、あなたのビューを再描画するようになります

this.listenTo(this.collection, 'add', this.render); 

。また、コード内のどこからでもtriggerを使用して、モデル、コレクション、その他のものにカスタムイベントをスローすることもできます。

編集:新しいユーザーがフォームを使用して追加されたときにユーザーリストビューを再レンダリングする具体的なケースについては、以下の手順を実行します。ユーザービューのinitializeメソッドで、コレクション、追加:

フォームビューで次に
this.listenTo(this.collection, 'add', this.render); 

...あなたは保存があなたの追加、保存の成功コールバックで、addNewUser方法では、サーバー上で完了するまで待ちたいと仮定:

userlisting.collection.add(model); 

これは、UserView iのインスタンスグローバルスコープの中にあります。これはあなたのために働くことを願っています!

+0

こんにちはarbuthnott、私はこのコードを追加し、私も前にこれを試みたが、それでも動作しません。モデルをコレクションに追加しないという問題はありますか? .saveは実際にはモデルをコレクションに追加しないAPI呼び出しのみを行いますか?これが私の理解を助けるように働くものについて、自分のコードの周りにもっと具体的にできるなら、本当に感謝します。ありがとうございました – user1190132

+1

@ user1190132確かに、私はあなたのコードを見ていました、そして私はより具体的に私の答えを編集することができます。基本的には正しくあります。コレクションにユーザーを追加していないためです。そのため、「追加」イベントは発生しません。 – arbuthnott

+0

ありがとう@アブスノット、残念ながら、これはまだ私のために働いていません。たぶん私はあなたの指示によく従っていないでしょう。私はあらゆる種類の組み合わせを試してみましたが、うまくいかないようです。私は何が起こる必要があるのか​​を教えてもらいますが、正しく制定することはできません。私はファンダメンタルズについてもっと学ぶ必要があると思います... – user1190132

関連する問題