12

我需要根据用户选择的日期是过去还是将来的日期来初始设置主干视图的模板,并在收集更改从不同日期提取数据时切换它。我该怎么做呢?我以为我可以将模板设置为一个函数,该函数根据我是否过去返回正确的选择器字符串,但这不起作用。

pR.views.ScheduleJobView = Backbone.Marionette.ItemView.extend({
    tagName: "tr",
    // NEED A WAY TO SWITCH THIS TOO
    template: "#schedule-job-template"
});


pR.views.ScheduleJobsView = Backbone.Marionette.CompositeView.extend({
    // DOESN'T WORK
    template: function () {
        if (this.isPast)
            return "#schedule-jobs-past-template";
        else
            return "#schedule-jobs-template";
    },      itemView: pR.views.ScheduleJobView,

    itemView: pR.views.ScheduleJobView,
    itemViewContainer: "tbody",

    // Defaults for the model's url
    baseUrl: "/schedules/day/",
    baseApiUrl: "/api/schedule/day/",
    // Empty object to store url parameters
    urlParameters: {},

    initialize: function () {
        pR.vent.bindTo("change:parameters", this.changeUrl, this);
        this.model.url = this.baseApiUrl;
    },

    onRender: function () {
        console.log("Rendering Jobs View");
    },

    // Change the main model's url
    changeUrl: function (parameters) {
        // merge new parameters with old ones
        this.urlParameters = _.extend(this.urlParameters, parameters);

        var url = "";
        var apiUrl = this.baseApiUrl;

        _.each(this.urlParameters, function (value, parameter) {
            // Add each parameter segment to the url
            url = url + parameter + '/' + value + '/';
            apiUrl = apiUrl + parameter + '/' + value + '/';
        });

        this.model.url = apiUrl;
        console.log("Updated CurrentDay model url to " + apiUrl);
        this.model.fetch();

        console.log("Navigating to " + url);
        pR.routers.appRouter.navigate(url);
    },

    // Check if we are in the past
    isPast: function () {
        var year = this.urlParameters.year;
        var month = this.urlParameters.month;
        var day = this.urlParameters.day;
        var selectedDate = Date(year, month, day);

        if (selectedDate < Date()){
            return true;
        } else {
            return false;
        }
    }
});

请注意,我在这里也使用了 Marionette 的复合视图,因此我还需要一种方法来根据时间范围更改 itemView 的模板。如果我的基本策略考虑不周,我绝对愿意以不同的方式处理这个问题。

4

2 回答 2

17

您正在将 this.template 设置为一个方法,而 Marionette 正在寻找一个字符串值。

您可能可以使用相同的逻辑但将其放入您的initialize方法中。

pR.views.ScheduleJobsView = Backbone.Marionette.CompositeView.extend({
    template: null,
    [ ... ]
    initialize: function () {
         if (this.isPast) {
             this.template = "#schedule-jobs-past-template";
         } else {
             this.template = "#schedule-jobs-template";
         }
于 2012-09-17T22:56:28.387 回答
2

为此内置了一个名为 getTemplate 的函数,我知道我在文档中看到了它(这就是我在谷歌上搜索的内容)

Marionette 模板切换文档

于 2014-07-31T11:13:33.103 回答