Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Backbone.jsに入門してみた #TechLunch

Backbone.jsに入門してみた #TechLunch

Backbone.jsに入門してみた
2013/11/20 (水) @ Livesense TechLunch
発表者:工藤 祐司

Livesense Inc.

April 21, 2014
Tweet

More Decks by Livesense Inc.

Other Decks in Technology

Transcript

  1. jQueryは素晴らしい より少ない記述で、より多くの処理してくれる上、 クロスブラウザ対応してくれる // Internet Explorer document.getElementById("hoge").style.filter = 'alpha(opacity=50)'; //

    Firefox document.getElementById("hoge").style.MozOpacity = 0.5; // Safari document.getElementById("hoge").style.opacity = 0.5; ↓ $("#hoge").fadeTo(0, 0.5);
  2. jQueryは素晴らしい。けど、 情報をDOMに入れてしまいがち var list = '' $.each(data, function(index, value){ list

    += '<li id=”item-”' + value.id + '>' + value.name + '</li>; }); $('ul').append(list);
  3. jQueryは素晴らしい。けど、 DOMから情報取り出すのが手間 サーバーとの通信や、レンダリング処理で、いつのまにか、読みにくい var list = “” $.each(data, function(index, value){

    list += '<li id=”item-”' + value.id + '>' + value.name + '</li>; }); $(“ul”).append(list); $(“li”).click(function(){ var id = this.attr(“id”).replace(“item-”,””); $.ajax({ method: “post”, url: “items”, data: {id: id}, dataType: “json” }).done(funciton(data){ ….
  4. Backbone.Model var Todo = Backbone.Model.extend({ defaults: function() { return {

    title: "予定なし", order: todos.nextOrder(), done: false }; } }); var todo = new Todo(); todo.set({title:”買い物”}); // trigger change todo.save(); // trigger sync
  5. Backbone.Collection var TodoCollection = Backbone.Collection.extend({ model: Todo, url: function() {

    return '/todos'; } }); var todos = new Todos(); todos.fetch(); // trigger reset
  6. Backbone.View var TodoView = Backbone.View.extend({ tagName: "li", // 要素指定 events:

    { "click .done" : "toggleDone", }, initialize: function() { this.listenTo(this.model, 'change', this.render); this.listenTo(this.model, 'destroy', this.remove); }, render:funciton(){ this.$el.html(this.template(this.model.toJSON())); return this; }
  7. (補足)RESTful APIの構築 Railsだとあっという間 $rails new backbone $cd backbone $rake db:create

    $rails g scaffold todo title order:integer done:boolean $rake db:migrate $rails s
  8. (補足)RESTful APIの構築 Rails4では少し修正が必要 •CSRF対策でエラーになるので、切る class ApplicationController < ActionController::Base # Prevent

    CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. - protect_from_forgery with: :exception + protect_from_forgery with: :null_session end •index.json.jbuilder、show.json.jbuilderに:id追加 json.array!(@todos) do |todo| - json.extract! todo, :title, :order, :done + json.extract! todo, :id, :title, :order, :done json.url todo_url(todo, format: :json) end
  9. 1.Backbone.jsを擬似RESTに設定する  // 古いHTTPサーバーをサポートするために、`emulateHTTP`を有効にする。 // このオプションを設定すると、`_method`パラメータと`X-Http-Method-Override` // ヘッダーを付与して、擬似的に`"PUT"`と`"DELETE"`をリクエストをする。 Backbone.emulateHTTP = false;

    // `application/json`リクエストを直で処理できない古いサーバーをサポートするために、 // `emulateJSON`を有効にすると ... 代わりに`application/x-www-form-urlencoded` // としてリクエストボディをエンコードし、`model`という名前のフォームパラメータとして、 // modelを送信します。 Backbone.emulateJSON = false; 2. backbone.jsのソースコードの_methodをsf_methodに書き換える。 (補足)Symfony1.3の場合
  10. 3. routing.ymlにこんな感じで設定 todos: class: sfPropelRoute url: /todos.:sf_format param: { module:

    todos, action: index, sf_format: json } options: { model: Todos, type:object } requirements: sf_method: [get]: todos_update: class: sfPropelRoute url: /todos/:id param: { module: todos, action: update } options: { model: Todos, type:object } requirements: id: \d+ sf_method: [put]: 4. アクションを頑張って書く (補足)Symfony1.3の場合
  11. Backbone.Events var object = {}; // 変数objectで object.on と object.trigger

    を使えるようにした _.extend(object, Backbone.Events); // alertという名前でイベントを登録 object.on("alert", function(msg) { alert("Triggered " + msg); }); // イベントの実行 object.trigger("alert", "an event");