[Notice] Announcing the End of Demo Server [Read me]
BlueMir 2012-11-07
cardView : apart js
@4860fba62d6c058b4607e8511caebe2510b08ae7
app/controllers/TaskApp.java
--- app/controllers/TaskApp.java
+++ app/controllers/TaskApp.java
@@ -41,7 +41,7 @@
 
     // TestCode 나중에 전부 웹소켓으로 바꾼다. 당연히 그걸 고려해서 짜야한다.
     public static Result cardView(String userName, String projectName) {
-        return ok(cardView.render());
+        return ok(cardView.render(ProjectApp.getProject(userName, projectName)));
     }
 
     @BodyParser.Of(BodyParser.Json.class)
app/views/code/gitView.scala.html
--- app/views/code/gitView.scala.html
+++ app/views/code/gitView.scala.html
@@ -1,62 +1,63 @@
 @(url : String, project:Project) @main("코드", project){
 <ul class="nav nav-tabs">
-    <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">@Messages("Files")</a></li>
-    <a href="@routes.CodeHistoryApp.historyUntilHead(project.owner, project.name)">@Messages("Commits")</a></li>
+  <a href="@routes.CodeApp.codeBrowser(project.owner, project.name)">@Messages("Files")</a>
+  </li>
+  <a href="@routes.CodeHistoryApp.historyUntilHead(project.owner, project.name)">@Messages("Commits")</a>
+  </li>
 </ul>
-
 <div class="well">Clone this repository : git clone @url</div>
 <div class="row" id="codeBrowser">
-    <div class="span3">
-        <ul id="codeRoot" class="well nav nav-list">
-            <li id="codeBrowserHeader"><a href="#">코드 탐색기</a></li>
-        </ul>
+  <div class="span3">
+    <ul id="codeRoot" class="well nav nav-list">
+      <li id="codeBrowserHeader"><a href="#">코드 탐색기</a></li>
+    </ul>
+  </div>
+  <div class="span9">
+    <div>
+      <span id="breadcrumbs">Breadcrumbs</span> <span> <select>
+          <option>master</option>
+      </select>
+      </span>
     </div>
-    <div class="span9" >
-        <div>
-            <span id="breadcrumbs">Breadcrumbs</span>
-            <span>
-                <select>
-                    <option>master</option>
-                </select>
-            </span>
-        </div>
-        <div id="folderView">
-            <table class="table table-bordered">
-                <thead>
-                    <tr>
-                        <th>FileName</th>
-                        <th>Commit Message</th>
-                        <th>Commit Date</th>
-                        <th>Author</th>
-                    </tr>
-                </thead>
-                <tbody>
-                </tbody>
-            </table>
-        </div>
-        <div id="codeView" class="hide">
-            <div>
-                <span id="commiter"></span> | <span id="commitDate"></span> | <span id="commitMessage"></span>
-                <span class="pull-right"><a id="rawCode" class="btn btn-mini" target="_blank">Raw</a></span>
-            </div>
-            <hr />
-            <div>
-                <pre><code style="overflow:hidden"></code></pre>
-            </div>
-        </div>
-        
+    <div id="folderView">
+      <table class="table table-bordered">
+        <thead>
+          <tr>
+            <th>FileName</th>
+            <th>Commit Message</th>
+            <th>Commit Date</th>
+            <th>Author</th>
+          </tr>
+        </thead>
+        <tbody>
+        </tbody>
+      </table>
     </div>
-    
+    <div id="codeView" class="hide">
+      <div>
+        <span id="commiter"></span> | <span id="commitDate"></span> | <span id="commitMessage"></span> <span
+          class="pull-right"><a id="rawCode" class="btn btn-mini" target="_blank">Raw</a></span>
+      </div>
+      <hr />
+      <div>
+        <pre>
+          <code style="overflow: hidden"></code>
+        </pre>
+      </div>
+    </div>
+  </div>
 </div>
 <div id="codeError" class="hide row">
-    <div class="well span12">
-        <p>HEAD커밋이 존재하지 않습니다. 다음과 같은 방법을 시도해 보세요</p>
-        <pre><code>git clone @url
+  <div class="well span12">
+    <p>HEAD커밋이 존재하지 않습니다. 다음과 같은 방법을 시도해 보세요</p>
+    <pre>
+      <code>git clone @url
 touch readme.md
 git add readme.md
 git commit -m "init"
-git push origin master</code></pre>
-    </div>
+git push origin master</code>
+    </pre>
+  </div>
 </div>
 <script type="text/javascript" src="/assets/javascripts/hljs.js"></script>
 <script type="text/javascript" src="/assets/javascripts/hljs.jquery.js"></script>
app/views/task/cardView.scala.html
--- app/views/task/cardView.scala.html
+++ app/views/task/cardView.scala.html
@@ -1,3 +1,5 @@
+@(project:Project)
+
 <!-- 실제로 이것들은 미리 로딩되어 있음 -->
 <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
@@ -63,145 +65,11 @@
     </form>
   </div>
 </div>
+<script src="/assets/javascripts/CardView.js"></script>
 <script>
-  //웹소켓은 그야말로 클라 노티에만 쓰고 노티오면 다시 리로딩.
-  //taskBoard는 완전히 따로 생각한다. 리로딩시 문제는 없음.
-  var cardLoad;
-  $(function() {
-    //angular!
-    var cardapp = angular.module('cardApp', [ 'ui' ]);
-    function CardCtrl($scope) {
-      $scope.card; //model
-      $scope.board = {};
-      $scope.input = {
-        comment : ""
-      };
-      cardLoad = function(id) {
-        $.ajax("c/" + id, {
-          dataType : "json",
-          success : function(data) {
-            $scope.card = data;
-            $scope.$apply();
-            adjust();
-          }
-        });
-      }
-      $.ajax("member", {
-        success : function(data) {
-          $scope.board.members = data;
-          adjust();
-        }
-      });
-      function adjust() {
-        if ($scope.card && $scope.board && $scope.board.members) {
-          var assignee = $scope.card.assignee;
-          var members = $scope.board.members;
-          for ( var i = 0; i < members.length; i++) {
-            members[i].assigned = false;
-            for ( var j = 0; j < assignee.length; j++) {
-              if (members[i]._id == assignee[j]._id) {
-                members[i].assigned = true;
-                assignee[j] = members[i];
-              }
-            }
-          }
-          $scope.$apply();
-        }
-        if ($scope.card && $scope.board && $scope.board.labels) {
-          var cardLabels = $scope.card.labels;
-          var boardLabels = $scope.board.labels;
-          for ( var i = 0; i < boardLabels.length; i++) {
-            boardLabels[i].state = false;
-            for ( var j = 0; j < cardLabels.length; j++) {
-              if (cardLabels[j]._id == boardLabels[i]._id) {
-                boardLabels[i].state = true;
-              }
-            }
-          }
-        }
-        $scope.$apply()
-      }
-      $.ajax("labels", {
-        success : function(data) {
-          $scope.board.labels = data;
-          adjust();
-        },
-        dataType : "json"
-      });
-      //inti function end 
-      $scope.addComment = function() {
-        $scope.card.comments.push($scope.input.comment);
-        server.addComment($scope.card._id, $scope.input.comment);
-        $scope.input.comment = "";
-
-      }
-      $scope.saveCard = function() {
-        $scope.card.labels = [];
-        for ( var i = 0; i < $scope.board.labels.length; i++) {
-          if ($scope.board.labels[i].state == true) {
-            $scope.card.labels.push($scope.board.labels[i]);
-          }
-        }
-        server.saveCard($scope.card);
-        console.log($scope.card);
-      }
-      $scope.showMemberList = function() {
-        $scope.input.assign = !$scope.input.assign;
-      }
-      $scope.makeCheckList = function(){
-        $scope.card.checklist = {
-          items : [],
-          title : "TODO"
-        };
-      }
-      $scope.addChecklist = function() {
-        $scope.card.checklist.items.push({
-          body : $scope.input.checklist,
-          state : false
-        });
-        $scope.input.checklist = "";
-        $scope.saveCard();
-      }
-      $scope.checkItem = function(item) {
-        $scope.saveCard();
-      }
-      $scope.assign = function(member) {
-        if (member.assigned) {
-          $scope.card.assignee.push(member);
-        } else {
-          $scope.card.assignee = _.without($scope.card.assignee, member);
-        }
-        $scope.saveCard();
-      }
-      cardLoad(1);// for TEST
-    }
-    cardapp.controller('CardCtrl', CardCtrl);//여기는 실제함수와 어트리뷰트간의 관계맺기
-    angular.bootstrap(document, [ 'cardApp' ]);
-
-    var server = {};
-    server.addComment = function(_id, str) {
-      $.ajax("comment", {
-        type : "POST",
-        data : {
-          body : str,
-          _id : _id
-        },
-        success : function(data) {
-          cardLoad(_id);
-        }
-      });
-    };
-    server.saveCard = function(card, callback) {
-      //서버로 카드 전체를 보내서 저장합니다.
-      $.ajax("card", {
-        type : "post",
-        data : JSON.stringify(card),
-        contentType : "text/json",
-        success : function(data) {
-          if (callback)
-            callback();
-        }
-      });
-    }
-  });
+$(document).ready(function(){
+  initCardView("/@project.owner/@project.name/task/");
+  cardLoad(1);// for TEST
+})
 </script>
+
app/views/task/taskView.scala.html
--- app/views/task/taskView.scala.html
+++ app/views/task/taskView.scala.html
@@ -1,129 +1,142 @@
-@(project:Project)
+@(project:Project) @main("TaskManager", project){
+<h1>TaskManager</h1>
+<style>
+section.line {
+  width: 150px;
+  float: left;
+  border: 2px solid #666666;
+  background: #fafafa;
+  margin-right: 5px;
+  border-radius: 5px;
+  text-align: center;
+  cursor: move;
+}
 
-@main("TaskManager", project){
-    
-  <h1>TaskManager</h1>
-  <style>
-  section.line {
-    width : 150px;
-    float : left;
-    border : 2px solid #666666;
-    background : #fafafa;
-    margin-right : 5px;
-    border-radius : 5px;
-    text-align : center;
-    cursor : move;
-  }
-  section.line header {
-    padding : 5px;
-    background-color : #dadada;
-    border-top-left-radius : 5px;
-    border-top-right-radius : 5px;
-  }
-  article.card {
-    background : #b9a;
-    margin : 4px;
-    border-radius : 3px;
-    border : 1px solid gray;
-    min-height : 20px;
-  }
-  .cardlist {
-    border: 2px solid #f1f1f1;
-    background: #f1f1f1;
-  }
-  .over {
-    border: 2px dashed #000;
-  }
-  
-  .dragTargetCard{
-    background-color: dadada;
-    color: dadada;
-  }
-  .blank{
-    min-height: 3px;
-  }
-  .overBlank{
-    min-height: 25px;
-    background-color: #ddd;
-  }
-  .fade{
-    background : #333;
-  }
-  </style>
-  <div ng-controller="controller">
-    <section ng-repeat="line in lines" class="line">
-      <header>{{line.title}}</header>
-      <div class="cardlist" id="cardlist_{{line._id}}" >
+section.line header {
+  padding: 5px;
+  background-color: #dadada;
+  border-top-left-radius: 5px;
+  border-top-right-radius: 5px;
+}
+
+article.card {
+  background: #b9a;
+  margin: 4px;
+  border-radius: 3px;
+  border: 1px solid gray;
+  min-height: 20px;
+}
+
+.cardlist {
+  border: 2px solid #f1f1f1;
+  background: #f1f1f1;
+}
+
+.over {
+  border: 2px dashed #000;
+}
+
+.dragTargetCard {
+  background-color: dadada;
+  color: dadada;
+}
+
+.blank {
+  min-height: 3px;
+}
+
+.overBlank {
+  min-height: 25px;
+  background-color: #ddd;
+}
+
+.fade {
+  background: #333;
+}
+</style>
+<div ng-controller="controller">
+  <section ng-repeat="line in lines" class="line">
+    <header>{{line.title}}</header>
+    <div class="cardlist" id="cardlist_{{line._id}}">
+      <article class="blank"></article>
+      <div ng-repeat="card in line.cards">
+        <article class="card" draggable="true" ui-event="{'dragstart': 'onDragStart(line, card)'}">
+          {{card.title}}</article>
         <article class="blank"></article>
-        <div ng-repeat="card in line.cards" > 
-          <article class="card" draggable="true" ui-event="{'dragstart': 'onDragStart(line, card)'}" >
-            {{card.title}}
-          </article>
-          <article class="blank"></article>
-        </div>
       </div>
-      <article>
-        <button ng-hide="newCard && newCard.targetLine == line" ng-click="showCardInput(line)">new Card</button>
-        <form ng-submit="addCard(line)" ng-show="newCard && newCard.targetLine == line">
-          <textarea ng-model="newCard.title"></textarea>
-          <input type="submit" value="add"/>
-        </form>
-      </article>
-    </section>
-    <section>
+    </div>
+    <article>
+      <button ng-hide="newCard && newCard.targetLine == line" ng-click="showCardInput(line)">new Card</button>
+      <form ng-submit="addCard(line)" ng-show="newCard && newCard.targetLine == line">
+        <textarea ng-model="newCard.title"></textarea>
+        <input type="submit" value="add" />
+      </form>
+    </article>
+  </section>
+  <section style="float: right">
+    <fieldset>
+      <legend>label List</legend>
       <article id="lables" ng-repeat="label in labels">
         <span>{{label.name}}</span>
       </article>
-      <aritcle ng-repeat="member in members">
-        <span>{{member.loginId}}</span>
-      </aritcle>
-    </section>
-  </div>
-  <script>
-  $(function(){
-    var myapp = angular.module('myapp', ['ui']);
-    var TaskCtrl = function($scope){
+    </fieldset>
+    <fieldset>
+      <legend>memberList</legend>
+      <aritcle ng-repeat="member in members"> <span>{{member.loginId}}</span> </aritcle>
+    </fieldset>
+  </section>
+</div>
+<script>
+  $(function() {
+    var myapp = angular.module('myapp', [ 'ui' ]);
+    var TaskCtrl = function($scope) {
       var dragStart = {};
-      var webSocket = new WebSocket("ws://" +location.host + location.pathname + "/connect");
-      webSocket.onmessage = function(e){
+      var webSocket = new WebSocket("ws://" + location.host + location.pathname
+          + "/connect");
+      webSocket.onmessage = function(e) {
         $scope.lines = JSON.parse(e.data);
         $scope.$apply();
       }
-      webSocket.onopen = function(){
+      webSocket.onopen = function() {
         console.log("socket Open!");
       }
-      webSocket.onclose = function(){
+      webSocket.onclose = function() {
         console.log("disconnected!");
         console.log("trying to reconnect...");
         console.log("unimplement");
       }
-      $scope.showCardInput = function(line){
-        $scope.newCard = {targetLine : line};
+      $scope.showCardInput = function(line) {
+        $scope.newCard = {
+          targetLine : line
+        };
       };
-      $scope.addCard = function(line){
+      $scope.addCard = function(line) {
         $.ajax("task/newCard", {
-          success : function(data){
+          success : function(data) {
             $scope.newCard.title = "";
-            line.cards.push(data);   
+            line.cards.push(data);
             $scope.$apply();
           },
           contentType : "text/json",
           dataType : "json",
-          data : JSON.stringify({line_id : line._id, card_data : $scope.newCard.title}),
+          data : JSON.stringify({
+            line_id : line._id,
+            card_data : $scope.newCard.title
+          }),
           type : "POST"
         });
         return false;
       }
 
       $.ajax("task/labels", {
-        success : function(data){
+        success : function(data) {
           $scope.labels = data;
         },
         dataType : "json"
       });
 
       $.ajax("task/member", {
-        success: function(data){
+        success : function(data) {
           $scope.members = data;
         }
       });
@@ -135,21 +148,23 @@
         $event.preventDefault();
       };
       $scope.onDrop = function($event, targetLine) {
-        if (dragStart === null ) return;
-        if( targetLine._id !== dragStart.line._id){
-          if (dragStart !== null ) {
+        if (dragStart === null)
+          return;
+        if (targetLine._id !== dragStart.line._id) {
+          if (dragStart !== null) {
             targetLine.cards.push(dragStart.card);
-            dragStart.line.cards = _.without(dragStart.line.cards, dragStart.card);
+            dragStart.line.cards = _.without(dragStart.line.cards,
+                dragStart.card);
           }
         }
         webSocket.send(JSON.stringify($scope.lines));
       };
       $scope.onDragStart = function(currentLine, currentCard) {
-          dragStart = {
-            line: currentLine, 
-            card: currentCard,
-            idx: _.indexOf(currentLine.cards, currentCard)
-          };
+        dragStart = {
+          line : currentLine,
+          card : currentCard,
+          idx : _.indexOf(currentLine.cards, currentCard)
+        };
       };
 
       $scope.onDragOverBlank = function($event) {
@@ -159,53 +174,62 @@
         $event.preventDefault();
       };
       $scope.onDropBlank = function($event, targetLine, targetCard) {
-        if (dragStart === null ) return;
+        if (dragStart === null)
+          return;
         var prvIdx = null;
-        if( targetLine._id == dragStart.line._id){
+        if (targetLine._id == dragStart.line._id) {
           targetLine.cards.splice(dragStart.idx, 1);
         } else {
-          dragStart.line.cards = _.without(dragStart.line.cards, dragStart.card);
+          dragStart.line.cards = _
+              .without(dragStart.line.cards, dragStart.card);
         }
-        targetLine.cards.splice(_.indexOf(targetLine.cards, targetCard)+1, 0, dragStart.card);
+        targetLine.cards.splice(_.indexOf(targetLine.cards, targetCard) + 1, 0,
+            dragStart.card);
         dragStart = null;
         webSocket.send(JSON.stringify($scope.lines));
       };
     };
     myapp.controller('controller', TaskCtrl);
-    angular.bootstrap(document, ['myapp']);
+    angular.bootstrap(document, [ 'myapp' ]);
   });
-  (function(){
-    $(".cardlist").live("drop", function(e){
-      if (e.stopPropagation) e.stopPropagation();
+  (function() {
+    $(".cardlist").live("drop", function(e) {
+      if (e.stopPropagation)
+        e.stopPropagation();
       e.preventDefault();
     });
 
-    $(".cardlist")
-      .live("dragover", function(e){
-        $(this).addClass("over");
-        return e.preventDefault();
-      })
-      .live("drop dragleave", function(e){
-        $(this).removeClass("over");
-      });
-    $(".card").live("dragstart", function(e){
+    $(".cardlist").live("dragover", function(e) {
+      $(this).addClass("over");
+      return e.preventDefault();
+    }).live("drop dragleave", function(e) {
+      $(this).removeClass("over");
+    });
+    $(".card").live("dragstart", function(e) {
     });
 
+    $(".blank").live("dragover", function(e) {
+      $(this).addClass("overBlank");
+      return e.preventDefault();
+    }).live("drop dragleave", function(e) {
+      $(this).removeClass("overBlank");
+    });
+    $(".cardlist")
+        .attr(
+            "ui-event",
+            "{dragover: 'onDragOver($event)', dragleave: 'onDragLeave($event)', drop: 'onDrop($event, line)'}");
     $(".blank")
-      .live("dragover", function(e){
-        $(this).addClass("overBlank");
-        return e.preventDefault();
-      })
-      .live("drop dragleave", function(e){
-        $(this).removeClass("overBlank");
-      });
-    $(".cardlist").attr("ui-event", "{dragover: 'onDragOver($event)', dragleave: 'onDragLeave($event)', drop: 'onDrop($event, line)'}");
-    $(".blank").attr("ui-event", "{dragover: 'onDragOverBlank($event)', dragleave: 'onDragLeaveBlank($event)', drop: 'onDropBlank($event, line, card)'}");
+        .attr(
+            "ui-event",
+            "{dragover: 'onDragOverBlank($event)', dragleave: 'onDragLeaveBlank($event)', drop: 'onDropBlank($event, line, card)'}");
   })();
-  </script>
-  <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
-  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
-  <script type="text/javascript" src="http://underscorejs.org/underscore.js"></script>
-  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
-  <script type="text/javascript" src="https://raw.github.com/angular-ui/angular-ui/master/build/angular-ui.min.js"></script>
+
+  //===============================
+  var URL_PREFIX = "/@project.owner/@project.name/task/";
+</script>
+<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.23/jquery-ui.min.js"></script>
+<script type="text/javascript" src="http://underscorejs.org/underscore.js"></script>
+<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.2/angular.min.js"></script>
+<script type="text/javascript" src="https://raw.github.com/angular-ui/angular-ui/master/build/angular-ui.min.js"></script>
 }
 
public/javascripts/CardView.js (added)
+++ public/javascripts/CardView.js
@@ -0,0 +1,141 @@
+var cardLoad;
+(function() {
+  //angular!
+  var URL_PREFIX = "";
+  var cardapp = angular.module('cardApp', [ 'ui' ]);
+  function CardCtrl($scope) {
+    $scope.card; //model
+    $scope.board = {};
+    $scope.input = {
+      comment : ""
+    };
+    cardLoad = function(id) {
+      $.ajax(URL_PREFIX + "c/" + id, {
+        dataType : "json",
+        success : function(data) {
+          $scope.card = data;
+          $scope.$apply();
+          adjust();
+        }
+      });
+    }
+    $.ajax(URL_PREFIX + "member", {
+      success : function(data) {
+        $scope.board.members = data;
+        adjust();
+      }
+    });
+    $.ajax(URL_PREFIX + "labels", {
+      success : function(data) {
+        $scope.board.labels = data;
+        adjust();
+      },
+      dataType : "json"
+    });
+    function adjust() {
+      if ($scope.card && $scope.board && $scope.board.members) {
+        var assignee = $scope.card.assignee;
+        var members = $scope.board.members;
+        for ( var i = 0; i < members.length; i++) {
+          members[i].assigned = false;
+          for ( var j = 0; j < assignee.length; j++) {
+            if (members[i]._id == assignee[j]._id) {
+              members[i].assigned = true;
+              assignee[j] = members[i];
+            }
+          }
+        }
+        $scope.$apply();
+      }
+      if ($scope.card && $scope.board && $scope.board.labels) {
+        var cardLabels = $scope.card.labels;
+        var boardLabels = $scope.board.labels;
+        for ( var i = 0; i < boardLabels.length; i++) {
+          boardLabels[i].state = false;
+          for ( var j = 0; j < cardLabels.length; j++) {
+            if (cardLabels[j]._id == boardLabels[i]._id) {
+              boardLabels[i].state = true;
+            }
+          }
+        }
+      }
+      $scope.$apply()
+    }
+    //inti function end 
+    $scope.addComment = function() {
+      $scope.card.comments.push($scope.input.comment);
+      server.addComment($scope.card._id, $scope.input.comment);
+      $scope.input.comment = "";
+
+    }
+    $scope.saveCard = function() {
+      $scope.card.labels = [];
+      for ( var i = 0; i < $scope.board.labels.length; i++) {
+        if ($scope.board.labels[i].state == true) {
+          $scope.card.labels.push($scope.board.labels[i]);
+        }
+      }
+      server.saveCard($scope.card);
+      console.log($scope.card);
+    }
+    $scope.showMemberList = function() {
+      $scope.input.assign = !$scope.input.assign;
+    }
+    $scope.makeCheckList = function() {
+      $scope.card.checklist = {
+        items : [],
+        title : "TODO"
+      };
+    }
+    $scope.addChecklist = function() {
+      $scope.card.checklist.items.push({
+        body : $scope.input.checklist,
+        state : false
+      });
+      $scope.input.checklist = "";
+      $scope.saveCard();
+    }
+    $scope.checkItem = function(item) {
+      $scope.saveCard();
+    }
+    $scope.assign = function(member) {
+      if (member.assigned) {
+        $scope.card.assignee.push(member);
+      } else {
+        $scope.card.assignee = _.without($scope.card.assignee, member);
+      }
+      $scope.saveCard();
+    }
+  }
+  
+  window.initCardView = function(url){
+    URL_PREFIX = url;
+    cardapp.controller('CardCtrl', CardCtrl);//여기는 실제함수와 어트리뷰트간의 관계맺기
+    angular.bootstrap(document, [ 'cardApp' ]);
+  }
+  var server = {};
+  server.addComment = function(_id, str) {
+    $.ajax(URL_PREFIX + "comment", {
+      type : "POST",
+      data : {
+        body : str,
+        _id : _id
+      },
+      success : function(data) {
+        cardLoad(_id);
+      }
+    });
+  };
+  server.saveCard = function(card, callback) {
+    //서버로 카드 전체를 보내서 저장합니다.
+    $.ajax(URL_PREFIX + "card", {
+      type : "post",
+      data : JSON.stringify(card),
+      contentType : "text/json",
+      success : function(data) {
+        if (callback)
+          callback();
+      }
+    });
+  }
+})();
Add a comment
List