Backbone.xmpp: Разграничете типовете елементи въз основа на идентификатора на елемент

Искам да разгранича възлови елементи въз основа на item_id с Backbone.xmpp. Например в todo.app за всеки елемент "todo", който искам за да можете да задавате различни бележки (или няколко потребители да публикуват бележки за всяка "задача"). Мислех да присвоя тези бележки на задача въз основа на идентификатора на задача.

Мога ли да използвам Backbone relational с Backbone.xmpp?

Всяка помощ или насоки се оценяват.

Edit2: Какви опции имам за съхраняване на вложени модели в листови възли на xmpp сървъра?

  1. задачите и бележките са отделни елементи, публикувани на листовия възел. Ще бъде ли ефективно да присвоявате коментари на todos? Разграничаването ще се основава на идентификатори на елементи (todoid: todo_1, noteid: todo

    $(function(){
    
    // ------------------- Todo Model ------------------
    
    var Todo = Backbone.RelationalModel.extend({
    
      relations: [{
         type: Backbone.HasMany,
         key: "children",
         relatedModel: "Todo",
         collectionType: "TodoList",
         reverseRelation: {
             key: "parent",
             includeInJSON: "id"
         } 
      }],
    
    initialize: function() {
      console.log("MODEL: initialize()");
      if (!this.get("order") && this.get ("parent")) {
        this.set( {order: this.get("parent").nextChildIndex() });
      }
    },
    
    defaults: function() {
        console.log("MODEL: defaults()");
      return { 
          done: false,
          content: "default content" };
    },
    
    nextChildIndex: function() {
        var children = this.get( 'children' );
        return children && children.length || 0;
    },
    
    clear: function() {
      this.destroy();
    }
    });
    
    note_1).

  2. todos са елементи, а бележките са масив от обекти вътре в todo елемент (JSON обекти)? Но с това решение няма да получавам известия, когато се публикуват бележки, тъй като това ще бъде актуализация на елемента със задачи. Освен това всички бележки ще се съхраняват в един елемент - и това може да стане много дълго.

  3. Първоначално имах идеята да картографирам задачи върху листови възли (като име на листов възел или атрибут „title“) и бележки за елементи, но BB.xmpp не поддържа това досега, нали?

Затова клоня към първото решение, при което задачите и бележките са разграничени по идентификатор на елемент.

Как е възможно в Backbone.xmpp да се постигне това?

Edit1: Кодът е за оригиналния todo.app с localstorage.

$(function(){

// ------------------- Todo Model ------------------

var Todo = Backbone.RelationalModel.extend({

  relations: [{
     type: Backbone.HasMany,
     key: "children",
     relatedModel: "Todo",
     collectionType: "TodoList",
     reverseRelation: {
         key: "parent",
         includeInJSON: "id"
     } 
  }],

initialize: function() {
  console.log("MODEL: initialize()");
  if (!this.get("order") && this.get ("parent")) {
    this.set( {order: this.get("parent").nextChildIndex() });
  }
},

defaults: function() {
    console.log("MODEL: defaults()");
  return { 
      done: false,
      content: "default content" };
},

nextChildIndex: function() {
    var children = this.get( 'children' );
    return children && children.length || 0;
},

clear: function() {
  this.destroy();
}
});

// ------------------- Колекция Todo ------------------

var TodoList = Backbone.Collection.extend({
model: Todo,
// Save all of the todo items under the `"todos"` namespace.
localStorage: new Store("todos-backbone"),

done: function() {
  return this.filter(function(todo){ return todo.get('done'); });
},

});
var Todos = new TodoList;

// ------------------- Todo View ------------------

var TodoView = Backbone.View.extend({
tagName:  "li",

template: _.template($('#item-template').html()),

events: {
  "keypress input.add-child": "addChild",
  "click .check"              : "toggleDone",
  "dblclick label.todo-content" : "edit",
  "click span.todo-destroy"   : "clear",
  "keypress .todo-input"      : "updateOnEnter",
  "blur .todo-input"          : "close"
},

initialize: function() {
    console.log("TODOVIEW: initialize()");
  this.model.bind('change', this.render);
  this.model.bind('destroy', this.remove);

  this.model.bind("update:children", this.renderChild);
  this.model.bind("add:children", this.renderChild);

  this.el = $( this.el );
  this.childViews = {};
},

render: function() {
  console.log("TODOVIEW: render()");
  $(this.el).html(this.template(this.model.toJSON()));
  this.setText();
  this.input = this.$('.todo-input');

  this.el.append("<ul>", {"class": "children"}).append("<input>", { type: "text", "class": "add-child" });

  _.each(this.get("children"), function(child) {
      this.renderChild(child);
  }, this);      
    return this;
},

  addChild: function(text) {
      console.log("TODOVIEW: addChild()");
      if (e.keyCode == 13){
          var text = this.el.find("input.add-child").text();
          var child = new Todo( { parent: this.model, text: text});
      }
  },

  renderChild: function(model){
      console.log("TODOVIEW: renderChild()");
    var childView = new TodoView({ model: model});
    this.childViews[model.cid] = childView;
    this.el.find("ul.children").append(childView.render());
  },

// Remove the item, destroy the model.
clear: function() {
    console.log("TODOVIEW: clear()");
  this.model.set({parent: null});
  this.model.destroy();
  //this.model.clear();
}
});

// ------------------ Приложението ------------------------

var AppView = Backbone.View.extend({
el: $("#todoapp"),

statsTemplate: _.template($('#stats-template').html()),

events: {
  "keypress #new-todo":  "createOnEnter",
  "keyup #new-todo":     "showTooltip",
  "click .todo-clear a": "clearCompleted",
  "click .mark-all-done": "toggleAllComplete"
},

initialize: function() {
    console.log("APPVIEW: initialize()");
  _.bindAll(this, 'addOne', 'addAll', 'render', 'toggleAllComplete');

  this.input = this.$("#new-todo");

  Todos.bind('add',     this.addOne);
  Todos.bind('reset',   this.addAll);
  Todos.bind('all',     this.render);

  Todos.fetch();
},

render: function() {

},

addOne: function(todo) {
  var view = new TodoView({model: todo});
  this.$("#todo-list").append(view.render().el);
},

addAll: function() {
  Todos.each(this.addOne);
},

// Generate the attributes for a new Todo item.
newAttributes: function() {
  return {
    content: this.input.val(),
    order:   Todos.nextOrder(),
    done:    false
  };
},

createOnEnter: function(e) {
    console.log("APPVIEW: createOnEnter()");
  if (e.keyCode != 13) return;
  Todos.create( this.newAttributes());
  this.input.val('');
},
});
var App = new AppView;
});

person Community    schedule 02.07.2012    source източник


Отговори (1)


Нищо конкретно не ви спира да използвате Backbone.relational заедно с Backbone.xmpp, освен да го накарате да работи;)

От друга страна, Backbone.xmpp предоставя известия в реално време, които няма да бъдат задействани, освен ако не запазите отново модела на задачи, така че да бъде публикуван отново във вашите XMPP възли. Освен това XMPP (както и гръбнак) поддържа просто ограничаване и вие наистина просто работите около него, когато се опитвате да изградите релационни данни около него.

Може да е много по-просто просто да предоставите бележките за елементите от задачи, което ще ви спести всички усилия от интегрирането с Backbone.relational.

person ggozad    schedule 03.07.2012
comment
Благодаря! Всъщност искам тези бележки да бъдат публикувани. Става дума само за навлизане по-дълбоко в backbone.xmpp и backbone. Ще ми трябва същата функционалност в моето приложение по-късно. Но все още не сте сигурни дали да използвате Backbone релационни или да използвате вложени модели, предложени тук: stackoverflow.com/questions/6353607/ . - person genericatz; 03.07.2012
comment
Бихте ли имали нещо против да прегледате кода, който съм написал досега в Edit1. Базирано е на оригиналното приложение за задачи, но ще добавя xmpp версията, след като накарам тази да работи. Получавам Uncaught TypeError: Object function (obj) { return new wrapper(obj); } няма метод 'isObject' във функцията createOnEnter() на изгледа на приложението. Просто искам да добавя бележки към задачите. Тук моделът Todo има много деца todo (базирани на модела todo). - person genericatz; 03.07.2012
comment
Малко е трудно да се разбере какво се случва, цигулка би помогнала много! - person ggozad; 04.07.2012
comment
Добре, разбрах какъв е основният ми въпрос, той е в Редактиране 2. Все пак ще създам Fiddle утре. - person genericatz; 07.07.2012
comment
Какво имате предвид под просто ограничаване? Съхраняване на бележки в елементите със задачи в масив като {todo1:{body: todo1, notes:[{id: todo1_note1,body: note1}], id:todo1 }? Backbone.xmpp ще изпраща ли известия, когато добавя бележка към масива бележки? - person genericatz; 08.07.2012
comment
Да това е вярно. И наистина backbone.xmpp ще ви уведоми, когато запишете вашия елемент от задачи с актуализираните бележки. - person ggozad; 08.07.2012
comment
ей! Накарах релационното приложение за задачи с коментари за localStorage да работи. Но сега виждам друг проблем, ако използвам масив вътре в елемент на възел, за да съхранявам бележките: ако ще има невероятно голямо количество бележки, тогава db записът ще експлодира. Да кажем за приложение за форум с публикации (елементи) и коментари (масив в един елемент). Може би друг подход ще бъде по-добър за публикации и коментари като елементи, публикувани в листовия възел, но с различни идентификационни структури, за да ги разграничите при извличане? Как да съпоставя този подход към модели и колекции? - person genericatz; 08.07.2012
comment
Openfire, който използвам сега за тестване, използва типа TEXT за колоната за полезен товар (igniterealtime.org/builds/openfire/docs/latest/documentation/), така че след 64kb ще бъде съкратено и не мисля, че ще е достатъчно във всички случаи за нишка и всички коментари в нишка. Мога обаче да променя типа на колоната на LONGTEXT или MEDIUMTEXT - мислите ли, че ще работи добре? - person genericatz; 08.07.2012