Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

access function in one view from another in backbone.js

Tags:

backbone.js

I have this structure of views:

window.templateLoaderView = Backbone.View.extend({});

window.PopupView = templateLoaderView.extend({
   initialize: function () {
       this.PopupModel = new PopupModel();
       this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup);
   },

   render: function() {
       template= _.template($('#'+this.PopupModel.templateName).html());
       $(this.el).html(template(this.PopupModel.toJSON()));
       $('#'+this.PopupModel.containerID).html(this.el);
   },

   loadTaskPopup: function() {
       this.PopupModel.loadTemplate("popupTask_templateHolder", "/js/templates/popup_task.html", "1", "container_dialog");
       this.render();
   }
});

window.TaskbarView = templateLoaderView.extend({

   initialize: function () {
       this.TaskbarModel = new TaskbarModel();
       this.PopupModel = new PopupModel();
   },

   loadTaskbarPopup: function() {
       this.event_aggregator.trigger("tasks_popup:show");
   }

});

So I would like to runf function in one view form another. As far as I understand, I need to bind them somehow. Is it possible to bind them in initialize function?

I saw here example: Backbone.js - Binding from one view to another? . They creating both objects and than somehow binding them.

Thanks in advance,

like image 512
kaha Avatar asked Dec 16 '22 08:12

kaha


1 Answers

I am kind of a fan of using the "Event Aggregator" pattern. I make sure that every view is given a copy of the same event aggregator object and they can all talk to each other through it... kind of like a CB radio :)

Do this before you create any views:

Backbone.View.prototype.event_aggregator = _.extend({}, Backbone.Events);

Now, you can publish/subscribe from anywhere:

window.PopupView = Backbone.View.extend({
    initialize: function() {
        _.bindAll(this, "loadTaskPopup");
        this.model = new PopupModel();
        this.event_aggregator.bind("tasks_popup:show", this.loadTaskPopup);
    },

    loadTaskPopup: function() {
        // do something with this.model
    }
});

window.TaskbarView = Backbone.View.extend({
    loadTaskbarPopup: function() {
      this.event_aggregator.trigger("tasks_popup:show")
    }
});
like image 66
Brian Genisio Avatar answered Dec 28 '22 05:12

Brian Genisio