如何在Id的click事件上调用函数,函数写在backbone.js的控制器上

时间:2014-03-01 08:41:26

标签: javascript backbone.js

我的控制器代码在这里

spine.module("communityApp", function (communityApp, App, Backbone, Marionette, $, _) {
  "use strict";


  communityApp.Controllers.pforumController = Marionette.Controller.extend(
    {
      init: function(){
        var func = _.bind(this._getpforum, this);
        var request = App.request('alerts1:entities' , {origin:'pforum'});
        $.when(request).then(func)

      },
      _getpforum:function(data){
        var pforumCollectionView = new communityApp.CollectionViews.pforumCollectionViews({
          collection: data
        });
        communityApp.activeTabView = pforumCollectionView;

        // Populating the data
        communityApp.activeTabLayout.pforum.show(pforumCollectionView);

      },



    }); 

  });

查看代码在这里

spine.module("communityApp", function (communityApp, App, Backbone, Marionette, $, _) {

  // Load template
  var a;
  var pforumTemplateHtml = App.renderTemplate("pforumTemplate", {}, "communityModule/tabContainer/pforum");
  // Define view(s)
  communityApp.Views.pforumView = Marionette.ItemView.extend({
    template: Handlebars.compile($(pforumTemplateHtml).html()),
    tagName: "li",
    onRender: function () {
      this.object = this.model.toJSON();
    },




    events: {
      "click #postcomment" : "alrt",
      "click #recent-btn": "recent",
      "click #my-posts": "myposts",
      "click #popular-btn": "popular",
      "click #follow-btn": "follow",
      "click #my-posts": "LeftLinks",
      "click #popular-btn": "LeftLinks",
      "click #follow-btn": "LeftLinks"

    },

    postcomments : function ()

    {
      $("#recent-post-main-container").hide();
      $("#recent-post-main-container2").show();

    },

    alrt : function ()
    {
      alert ("In Progress ......");
    },



    showCommentEiditor : function (){

      $(".comment-popup-container").show();
      $(".comment-txt-area").val('');

    },

    showPforumTab : function ()
    {
      $("#recent-post-main-container2").show();
      $("#recent-post-main-container").hide();
    },

    showComments : function(){

      $("#loading").show();
      $(".tab-pane").hide();
      $(".left-content").hide();
      $("#recent-post-main-container2").show();
      //$(".left-content-commentEditor").show();
      $(".comm-tab-content-container").css('height','200px');
      $(".comment-txt-area").val('');
      $(".left-content-comment").show();
    },

    hideCommentPopup : function ()
    {
      $("#public-question-comment").hide();
    },
    // Show Loading sign
    showLoading : function () {
      $('#loading').show();
    },

    // UnLoading Function
    hideLoading : function (){
      $('#loading').hide();
    },

    // Add New Event Function
    addEvent : function()
    {
      //$("#name").val(getBackResponse.user.FullName);
      //$("#phone").val(getBackResponse.user.CellPhone);
      //$("#email").val(getBackResponse.user.UserName);
      $(".overly.addevent").show();
      $('#lang').val(lat);
      $('#long').val(long);
      document.getElementById("my-gllpMap").style.width = "100%";
      var my_gllpMap = document.getElementById("my-gllpMap");
      google.maps.event.trigger( my_gllpMap, "resize" );
    },

    setValues : function(key,value)
    {
      window.localStorage.setItem(key,value);       
    },

    getValues : function (key) 
    {
      return window.localStorage.getItem(key);      
    },

    closeAddEvent:function ()
    {
      $(".overly.addevent").hide();
    },

    // Show Over lay
    showOverly:function ()
    {
      $('.overly-right-tab').show();
    },

    // Hide Loading sign
    hideOverly : function()
    {
      $('.overly-right-tab').hide();
    },

    LeftLinks: function (e) {

      var elem = $(e.target).closest('a');

      var elem = $(e.target).closest('a');
      var event = elem.attr('name');
      switch (event) {
      case "myposts":
        var _this = $.extend({}, this, true);
        _this.event = 'myposts';
        this.LinkUrl.call(_this);
        //$("#my-posts").addClass('active');
        //$("#public-fourm-top-tab").addClass('TabbedPanelsTabSelected');
        //$(".types").removeClass('active');

        break;
      case "recents":
        var _this = $.extend({}, this, true);
        _this.event = 'recents';
        this.LinkUrl.call(_this);
        $(".types").removeClass('active');
        $("#recent-btn").addClass('active')
        //$("#pforum").removeClass('active');
        // $("#recent").addClass('active');
        break;
      case "populars":
        var _this = $.extend({}, this, true);
        _this.event = 'populars';
        this.LinkUrl.call(_this);
        $(".types").removeClass('active');
        $("#popular-btn").addClass('active')
        // $("#pforum").removeClass('active');
        //$("#popular").addClass('active');
        break;
      case "follows":
        var _this = $.extend({}, this, true);
        _this.event = 'follows';
        this.LinkUrl.call(_this);
        $(".types").removeClass('active');
        $("#follow-btn").addClass('active')
        break;
      }

    },

    LinkUrl: function (modalThis) {

      communityApp.activeTabView.collection = []; // currently empty data
      communityApp.activeTabView.render();
      className: 'comm-main-container'
      // uncomment these lines when getting data fro web service route, it will repopulate the data

      var func = _.bind(function (data) {

        communityApp.activeTabView.collection = data;
        communityApp.activeTabView.render();
      }, this);

      switch (this.event) {
      case "myposts":
        $.when(App.request('alertLinks:entities', {
          origin: 'pforum', 
          event: this.event

        })).then(func);
        break;
      case "recents":
        $.when(App.request('alertLinks:entities', {
          origin: 'pforum',

          event: this.event
        })).then(func);
        break;
      case "populars":
        $.when(App.request('alertLinks:entities', {
          origin: 'pforum',
          origin1:'popular',
          event: this.event
        })).then(func);


        break;
      case "follows":
        $.when(App.request('alertLinks:entities', {
          origin: 'pforum',

          event: this.event
        })).then(func);
        break;
      }


      return true;



    }


  });

  // define collection views to hold many communityAppView:
  communityApp.CollectionViews.pforumCollectionViews = Marionette.CollectionView.extend({
    tagName: "ul",
    itemView: communityApp.Views.pforumView
  });

});

1 个答案:

答案 0 :(得分:0)

每当我需要在视图和控制器之间共享事件时,我通常会在实例化控制器的模块中连接监听器。这个例子有点人为,但它得到了重点。 full working code is in this codepenapplication's event aggregator。相关位在此处复制。注意视图的事件在控制器上触发方法的行this.listenTo(view, 'itemview:selected', this.itemSelected);

App.module("SampleModule", function(Mod, App, Backbone, Marionette, $, _) {

  // Define a controller to run this module
  // --------------------------------------

  var Controller = Marionette.Controller.extend({

    initialize: function(options){
      this.region = options.region
    },

    itemSelected: function (view) {
      var logView = new LogView();
      $('#log').append(logView.render('selected:' + view.cid).el);
    },

    show: function(){
      var collection = new Backbone.Collection(window.testData);

      var view = new CollectionView({
        collection: collection    
      });

      this.listenTo(view, 'itemview:selected', this.itemSelected);

      this.region.show(view);
    }

  });


  // Initialize this module when the app starts
  // ------------------------------------------

  Mod.addInitializer(function(){
    Mod.controller = new Controller({
      region: App.mainRegion
    });
    Mod.controller.show();
  });
});

实现这一目标的另一种方法是,如果你不能在同一个模块中连接它,那就是使用Marionette的消息传递基础设施。例如,您可以使用{{3}}来传递事件。