Backbone.js is not rendering views properly

NN796

I am new at ruby on rails and backbone as well. I have an existing code in backbone and ruby which is working fine which creates some boards and one board have many lists and so on. I will provide code for that one also if needed. Now I am going to add some feature of categories like user can create and delete categories and each categories have many boards. Following data is displayed on browser from Database which is correct. I am not getting it properly why proper views are not displaying on browser.

Category Page

Following is the code. Kindly suggest me some code changes so that it will work. It will be really appreciated. Thanks in advance.

/app/assets/javascripts/collections/categories.js

Kanban.Collections.Categories = Backbone.Collection.extend({
  model: Kanban.Models.Category,
  url: "/categories",
});

app/assets/javascripts/models/category.js

Kanban.Models.Category = Backbone.RelationalModel.extend({

  urlRoot: "/categories",

	relations: [{
		type: Backbone.HasMany,
		key: "boards",
		relatedModel: "Kanban.Models.Board",
		collectionType: "Kanban.Collections.Boards",
		reverseRelation: {
			key: "category"
		}
	}]

});

app/assets/javascripts/views/categories/categories_index.js

Kanban.Views.CategoriesIndex = Backbone.View.extend({
  template: JST['categories/index'],
  tagName: "section",
  className: "categories-index",

  events: {
    "submit form.create_category": "createCategory"
  },

  initialize: function () {
    var that = this;
    that.collection.on("all", that.render, that);
  },

  render: function () {
    var that = this;

    var renderedContent = that.template({
      categories: that.collection
    });

    that.$el.html(renderedContent);

    console.log("categories ka render");
    return that;
  },

  createCategory: function (event) {
    event.defaultPrevented();
    var that = this;

    // get form attrs, reset form
    var $form = $(event.target);
    var attrs = $form.serializeJSON();
    $form[0].reset();

    var category = new Kanban.Models.Category();

    // fail if no category name
    if (!attrs.category.name) {
      var $createContainer = $("div.create_category");
      var $nameInput = that.$el.find("input.category_name");

      $nameInput.hide();
      $createContainer.effect("shake", {
        distance: 9,
        times: 2,
        complete: function () {
          $nameInput.show();
          $nameInput.focus();
        }
      }, 350);
      return false;
    }

    // save list
    category.save(attrs.category, {
      success: function (data) {
        // category.get("users").add(Kanban.currentUser);
        that.collection.add(category);

        // keep focus on list input
        that.$el.find("input.category_name").focus();
      }
    });
  }

});

app/assets/javascripts/routers/main_routers.js

Kanban.Routers.Main = Backbone.Router.extend({
  initialize: function (options) {
    this.$rootEl = options.$rootEl;
  },

  routes: {
    "": "index",
    "/login": "login",
    "categories/:id": "showCategoryBoards",
    "boards/:id": "showBoardLists"
    //"boards/:id": "deleteBoard"
  },

  index: function () {
    var that = this;

    var categoriesIndex = new Kanban.Views.CategoriesIndex({
      collection: Kanban.categories
    });
    
    that.$rootEl.html(categoriesIndex.render().$el);
  },



//index: function () {
    //var that = this;

    //var boardsIndex = new Kanban.Views.BoardsIndex({
      //collection: Kanban.boards
    //});
    
    //that.$rootEl.html(boardsIndex.render().$el);
  //},



  showCategoryBoards: function (id) {
    var that = this;

    var category = Kanban.categories.get(id);
    var categoryShow = new Kanban.Views.BoardIndex({
      model: category
    });

    that.$rootEl.html(categoryShow.render().$el);
  },



showBoardLists: function (id) {
    var that = this;

    var board = Kanban.boards.get(id);
    var boardShow = new Kanban.Views.BoardShow({
      model: board
    });

    that.$rootEl.html(boardShow.render().$el);
  }

});

app/assets/javascripts/kanban.js

window.Kanban = {
  Models: {},
  Collections: {},
  Views: {},
  Routers: {},
  initialize: function() {
    var that = this;

    that.$rootEl = $("#content");

    Kanban.currentUser = new Kanban.Models.CurrentUser();
    Kanban.currentUser.fetch({
      success: function (response) {
          // console.log("got user");
          
        Kanban.category = new Kanban.Models.Category();
        Kanban.category.fetch({
          success: function (response) {   

            Kanban.boards = new Kanban.Collections.Boards();
            Kanban.boards.fetch({
              success: function (response) {
                // console.log("got boards");
                new Kanban.Routers.Main({ $rootEl: that.$rootEl });
                Backbone.history.start();

               }
             });
          },

          error: function (response) {
            // console.log("please log in");
          }
        });
      }
    });
  }
};

$(document).ready(function(){
  Kanban.initialize();


});


//BOARD DELETION METHOD... !
$(document).on("click", ".delete-icon", function() {
  var board_id = $(this).parent().attr('id');
  $.ajax({
    url: "/api/boards/"+board_id,
    type: 'DELETE',
    success: function(result) {
      $("#"+board_id).remove();
    }
  });
});

//LIST DELETION METHOD... !

$(document).on("click", ".list-delete-icon", function() {
  var listId = $(this).parent().attr('id').replace(/list_/, '');
  // alert(listId);
  //var id = $("div").attr('id').replace(/button/, '');
  $.ajax({
    url: "/api/lists/"+listId,
    type: 'DELETE',
    success: function(result) {
      alert("success!!!");
      $("#list_"+listId).remove();
    }
  });
});

//card DELETION METHOD... !

app/assets/templates/categories/index.jst.ejs

<header class="categories-index">
  <span class=""></span>
  <h2>My Categories</h2>
</header>
<div>
<ul class="nav pull-left navbar-nav">
  <% categories.each(function (category) { %>
    <li id="<%= category.id %>" class="boxes">
      <a href="/#categories/<%= category.id %>">

        <%= category.escape("title") %>
      </a>
      
      <div class="delete-icon">
        <span class="glyphicon glyphicon-trash">
      </div>

    </li>
  <% }); %>
<li class="boxes">
    <p>Create New Category</p>
    <form class="create_category" id="myform">
      <input type="text" 
             id="customInput"
             class="category_name"
             name="category[title]"
             placeholder="Category Name ..." />
      <input type="text"
             class="category_description"
             name="category[description]"
             placeholder="Category Description ..." />
      <input type="submit" value="Create Category" />
    </form>
</li>
</ul>
</div>

/app/controllers/categories_controller

class CategoriesController < ApplicationController
  # before_action :set_category, only: [:show, :edit, :update, :destroy]

  respond_to :json

  def index
    @categories = Category.all
    # respond_with(@categories)
    # @categories = current_user.categories.includes(:boards)
  end

  def show
    respond_with(@category)
  end

  def new
    @category = Category.new
    respond_with(@category)
  end

  def edit
  end

  def create
    category = Category.new(params[:category])

      if category.save

        # board.members << current_user
        render json: category, status: :ok
      else
        render json: category.errors, status: :unprocessable_entity
      end
  end

  def update
    @category.update(category_params)
    respond_with(@category)
  end

  def destroy
    @category.destroy
    respond_with(@category)
  end

  private
    def set_category
      @category = Category.find(params[:id])
    end

    def category_params
      params.require(:category).permit(:title, :description)
    end
end

app/models

class Category < ActiveRecord::Base
    attr_accessible :title, :description
    has_many :boards, dependent: :destroy
end

app/views/categories/index.rabl

collection @categories
attributes :id, :title, :description

config/routes.rb

Kanban::Application.routes.draw do



  devise_for :users
  resources :users

  # root to: "categories#index"  


  root to: "root#index"
  resource :root, only: [:index]

  resources :categories

#  resource :session, only: [:new, :create, :destroy]
   #get "login" => "sessions#new"
  # get "logout" => "sessions#destroy"

  # resources :users, only: [:show]

  namespace :api do

    resources :users, only: [:show] do
      collection do
        get :current
      end
    end

    resources :boards, only: [:index, :show, :create, :update, :destroy]

    resources :lists , except: [:edit] do
      collection do
        post :sort
      end
    end

    resources :cards, except: [:edit] do
      collection do
        post :sort
      end
    end

    resources :card_comments, only: [:index, :create, :destroy]
  end
end
Mashhood

you're trying to initialize a "collection" instead of a "model" in your CategoriesIndex file:

initialize: function () {
var that = this;
that.collection.on("all", that.render, that);

which is being called from your Route file calling constructor with collection.

index: function () {
var that = this;

var categoriesIndex = new Kanban.Views.CategoriesIndex({
  collection: Kanban.categories,

});

that.$rootEl.html(categoriesIndex.render().$el);
},

so, see your kanban.js file

it should be:

Kanban.categories = new Kanban.Collections.Categories();
Kanban.categories.fetch({

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Backbone.js is not rendering views properly

From Dev

Re-rendering backbone.js views on resize?

From Dev

Rendering a listview backbone js

From Dev

Backbone JS - View not rendering

From Dev

Backbone views not rendering without predefined el specified

From Dev

How to properly use Backbone views and router

From Dev

Backbone.Marionette - view is not rendering properly

From Dev

BackBone View not rendering properly and not sure why

From Dev

Backbone JS, navigating different views

From Dev

Backbone.js rendering delay?

From Dev

Laravel 4.2 not rendering Blade views properly

From Dev

Laravel 4.2 not rendering Blade views properly

From Dev

Backbone views events not working when rendering more than once

From Dev

Backbone.js views and models correlation?

From Dev

how to switch views with the backbone.js router?

From Dev

Views and appending table rows in backbone.js

From Dev

Backbone JS - Combination of collection, views and models

From Dev

Simple Backbone.js and Google Maps Rendering

From Dev

Backbone.js rendering Collection View issue

From Dev

Iconic JS not rendering properly with Ember

From Dev

page not rendering properly angular js

From Dev

How to render Backbone.js view properly

From Dev

What exactly is this.el in Backbone.js views?

From Dev

Backbone.js parent vs. child views

From Dev

What is the order of events binded by Views in Backbone.js?

From Dev

Is it an anti-pattern to instantiate models in views in Backbone.js?

From Dev

How to load multiple Backbone.js views on a single page

From Dev

Passing Data to Views in Backbone Js does not see in the browser

From Dev

backbone js view event binding only to views elements

Related Related

HotTag

Archive