【问题标题】:Backbone calling Controller method from Views主干从 Views 调用 Controller 方法
【发布时间】:2015-02-10 20:57:39
【问题描述】:

[Backbone 新手]
按计划工作 应用程序.use case 是。

1) 用户点击重新安排按钮。 [在视图中]
2) 获取可用的时间表。 [在控制器中]
3) 用户选择时间表之一。 [查看中]
4) 将更新的日程表发布到服务器。 [在控制器中]
5) 重新渲染视图

问题是 (1),(3) 在 View 上,(2),(4) 在 Controller 上。
我需要路由视图-> 路由-> 控制器。每一步。
这是将事件传递给控制器​​的正确方法吗?有没有更好的方法??
这是使用 Backbone.Events 的情况吗?

文件夹结构。 [使用 Require , Backbone ]

├───app
│   ├───managers
│   ├───models
│   ├───utils
│   └───views
├───lib
└───tpl

调度模型。

    Schedule = Backbone.Model.extend({
                initialize: function () {
                    console.log("Schedule model initialized");
                }
            }),

计划视图:

    events : {
                "click #cancel_login_trip" : "cancelLoginTrip",
                "click #cancel_logout_trip" : "cancelLogoutTrip",
            },

    cancelLoginTrip : function(){
                var tripindex = this.model.get('previousIndex')+1;
                tripindex  = "login_"+tripindex;
                Backbone.history.navigate('schedule/cancel/'+tripindex, {trigger:true,replace:true});   
            },

路线

 cancelSchedule : function (tripindex) {
            var t = tripindex.split("_");
            var dic={};
            dic.tripindex = parseInt(t[1]);
            dic.triptype = t[0];
            scheduleManager.cancelSchedule(dic);
        },    

调度管理器[控制器]:

    this.cancelSchedule = function(dic){
                console.log("inside cancel schedule");
                console.log(dic);
                index = dic.tripindex;
                scheduleDaysize = configManager.getFeatureConfig(Constants.SCHEDULE,Constants.SCHEDULE_DAYS_AFTER);
                myAnalyticsLogger.debug(LogMessages.REQUEST_TO_DISPLAY_SCHEDULE + index);
                if(index<0){
                    var errorText= 'past schedule can not be viewed ';
                    errorModel.set({errorText:errorText,response:""});
                    return;
                }
                if(index >= scheduleCollection.length && scheduleDaysize != null){              
                    var errorText= 'this schedule can not be cancelled ';
                    errorModel.set({errorText:errorText,response:""});
                    return;
                }
                updateScheduleOnServer(scheduleCollection.length, 
                            scheduleCollection.length+scheduleDaysize); 
            };

【问题讨论】:

  • 1.显示一些代码 2. 从来不知道主干中有一个叫controller 的东西!
  • 骨干中没有controller这样的东西,只需将控制器代码移至视图即可,无需将事件传递到视图之外。
  • 这对我来说是不可能的,因为我已经从早期的开发人员那里接手了庞大的代码库。
  • hmm... 在那种情况下Backbone.Events 会更合适。视图触发事件,控制器监听这些事件。

标签: backbone.js


【解决方案1】:

我个人的方法是创建许多小视图,并在具有所有逻辑的大型模型上放置中间控制器。如果这不是一个选项,最好的解耦恕我直言的方法是通过全局事件模型

var vent = {}
_.extend(vent,Backbone.Events);

vent.on()
vent.trigger()

您可以将它用于所有应用程序,或特定于域的一部分

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 2011-09-14
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2012-07-23
    相关资源
    最近更新 更多