Här kommer information om de ingående objekt som min To-do applikation kommer att använda. Kommer även lägga upp klassdiagram som är skapade med hjälp av http://www.yuml.me, som jag ett flertal gånger tidigare har använt till både klassdiagram och aktivitetsdiagram. Längre ned finns även kod-exempel på hur dessa modeller/objekt ser ut i Backnone. (Notera, dessa är endast ”skal” och kan komma att förändras lite vid implementerings-steget) Gå direkt dit.

Task

1
2
3
4
5
6
7
8
Task = {
    taskId : 1, // Integer.
    content : "Go to school.", // String.
    time : {}, // Date.
    completed : false, // Boolean.
    userId : 1, // Integer.
    categoryId : 1 // Integer.
}

Task objektet är mer eller mindre huvud objektet i To-do applikationen då det kommer att innehålla själva ”att göra uppgiften”. Det kommer att innehålla ett taskId för enklare borttagning och editering av uppgiften. Content som självklart innehåller själva uppgiften. Time egenskapen ska innehålla en tidsstämpel t.ex. 2012-01-20 19:38. Completed som är en boolean som kommer att ändras om man har slutfört ( kryssat checkboxen) uppgiften och självklart ett userId  som kopplar en task till en viss användare. Task objektet innehåller även en egenskaper, categoryId, som kopplar tasken till en specifik kategori.

User

1
2
3
4
User = {
    userId : 2, // Integer.
    name : "Anders", // String.
}

User är, som namnet säger, ett objekt som har två egenskaper. Den första egenskapen, userId är ett Id för användaren och det andra är name som är namnet på användaren.

Category

1
2
3
4
Category = {
    categoryId : 1, // Integer.
    label : "Work", // String.
}

Category är ett objekt som även den endast innehåller två egenskaper, ett Id och en label som ska fungera som namnet för kategorin.

TodoEvent

1
2
3
4
5
TodoEvent = {
    name : "Deleted", // String.
    time : {}, // Date.
    userId : 1, // Integer.
}

 Event, är tänkt att användas som ett objekt för händelseloggen där den ska presentera senaste händelser t.ex att användaren Anders tog bort uppgiften ”Go to school”.

Backbone reprsentation av modellerna

Task

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Task = Backbone.RelationalModel.extends({
  // Define the relations of the object using relational.
  relations : [
    {
      type : Backbone.HasOne,
      key : 'userId',
      relatedModel : 'User',
      includeInJSON : Backbone.Model.prototype.idAttribute,
      collectionType : 'UserCollection'
    },
    {
      type : Backbone.HasOne,
      key : 'categoryId',
      relatedModel : 'Category',
      includeInJSON : Backbone.Model.prototype.idAttribute,
      collectionType : 'CategoryCollection'
    }
  ],
 
  defaults : {
    taskId : null,
    content : null,
    time : null,
    completed : false,
    userId : null,
    categoryId : null  
  },
 
  initialize : function() {
    // Empty function for future need.
  },
 
  /**
    * @param {Array} attrs The attributes to validate.
    * @returns {String} If something does not validate, return string
    * (throw error in backbone.) does not run set or save on model.
    */
  validate : function( attrs ) {
    if (  attrs.taskId === null || attrs.content === null || 
          attrs.time === null || attrs.completed === null || 
          attrs.userId === null || attrs.categoryId === null ) {
           return "The task object does not validate."; 
    }
  }
});

Category

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Category = Backbone.Model.extends({
  defaults : {
    categoryId : null,
    label : null;
  },
 
  initialize : function() {
    // Empty function for future need.
  },
 
  /**
    * @param {Array} attrs The attributes to validate.
    * @returns {String} If something does not validate, return string
    * (throw error in backbone.) does not run set or save on model.
    */
  validate : function( attrs ) {
    if (  attrs.categoryId === null || attrs.label === null ) {
           return "The category object does not validate."; 
    }
  }
});

User

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
User = Backbone.Model.extends({
  defaults : {
    userId : null,
    name : null
  },
 
  initialize : function() {
    // Empty function for future need.
  },
 
  /**
    * @param {Array} attrs The attributes to validate.
    * @returns {String} If something does not validate, return string
    * (throw error in backbone.) does not run set or save on model.
    */
  validate : function( attrs ) {
    if (  attrs.userId === null || attrs.name === null ) {
           return "The User object does not validate."; 
    }
  }
});

TodoEvent

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
TodoEvent = Backbone.Model.extends({
  // Define the relations of the object using relational.
  relations : [
    {
      type : Backbone.HasOne,
      key : 'userId',
      relatedModel : 'User',
      includeInJSON : Backbone.Model.prototype.idAttribute,
      collectionType : 'UserCollection'
    }
  ],
 
  defaults : {
    name : null,
    time : null,
    userId : null
  },
 
  initialize : function() {
    // Empty function for future need.
  },
 
  /**
    * @param {Array} attrs The attributes to validate.
    * @returns {String} If something does not validate, return string
    * (throw error in backbone.) does not run set or save on model.
    */
  validate : function( attrs ) {
    if (  attrs.name === null || attrs.time === null || 
          attrs.userId === null ) {
           return "The ToDoEvent object does not validate."; 
    }
  }
});

Återigen, notera gärna att dessa modeller är framtagna för att jag ska ha en god förståelse över hur mina modeller/objekt kommer att se ut. Jag har även försökt att definera relationerna genom ”relations:” attributet i varje model. Som ni säkert ser så extendar modellerna med relationer from RelationlModel istället för från Model, detta är ett krav för att relationerna ska fungera i Backbone. Eftersom jag använder localStorage så kan modellerna komma att förändras, men eftersom backbone-localStorage.js skriver över Backbone.sync() så borde inte mycket alls förändras. Mer om förändringarna kommer att kommenteras i det här inlägget, men även i framtida inlägg som relaterar till ämnet/problemet/lösningen.