创建模板&在JS中使用变量替换

时间:2017-09-05 03:04:44

标签: javascript templates scope

我正在使用我们的图表/图表(使用chart.js)创建一些功能,这将允许用户选择他们想要查看的时间范围。我创造了一些有用的东西;但是由于我们有4个不同的图表,我不想通过重用这些代码然后找到&来创建一个巨大的,低效的文档。更换已更换的部件。相反,我想创建一个创建一次的模板对象,然后用该图形自己的属性替换模板化/通用变量名称。

以下是我创建的代码的精简版本:

        $("#engagementDaily").hide();
        $("#engagementWeekly").hide();
        $("#engagementMonthly").hide();
        $("#engagementYearly").hide();
        $("#engagementDay").click(function(){
            engGraph.options.scales.xAxes[0].time.unit = 'day'
            $(this).addClass('active');
            nullXAxes();
            $("#engagementDaily").fadeIn();
            $("#engagementWeekly").hide();
            $("#engagementMonthly").hide();
            $("#engagementYearly").hide();
            engGraph.update();
        });
        $("#engagementWeek").click(function(){
            engGraph.options.scales.xAxes[0].time.unit = 'week'
            $(this).addClass('active');
            nullXAxes();
            $("#engagementDaily").hide();
            $("#engagementWeekly").fadeIn();
            $("#engagementMonthly").hide();
            $("#engagementYearly").hide();
            engGraph.update();
        });
        $("#engagementMonth").click(function(){
            engGraph.options.scales.xAxes[0].time.unit = 'month'
            $(this).addClass('active');
            nullXAxes();
            $("#engagementDaily").hide();
            $("#engagementWeekly").hide();
            $("#engagementMonthly").fadeIn();
            $("#engagementYearly").hide();                
            engGraph.update();
        });
        $("#engagementYear").click(function(){
            engGraph.options.scales.xAxes[0].time.unit = 'year'
            $(this).addClass('active');
            nullXAxes();
            $("#engagementDaily").hide();
            $("#engagementWeekly").hide();
            $("#engagementMonthly").hide();
            $("#engagementYearly").fadeIn();
            engGraph.update();
        });
        $("#engagementAutoDay").click(function(){
            engGraph.options.scales.xAxes[0].time.min = null;
            engGraph.options.scales.xAxes[0].time.max = null;
            $(this).addClass('active');
            engGraph.update();
        });
        $("#engagementAutoWeek").click(function(){
            engGraph.options.scales.xAxes[0].time.min = null;
            engGraph.options.scales.xAxes[0].time.max = null;
            $(this).addClass('active');
            engGraph.update();
        });
        $("#engagementAutoMonth").click(function(){
            engGraph.options.scales.xAxes[0].time.min = null;
            engGraph.options.scales.xAxes[0].time.max = null;
            $(this).addClass('active');
            engGraph.update();
        });    
        $("#engagementAutoYear").click(function(){
            engGraph.options.scales.xAxes[0].time.min = null;
            engGraph.options.scales.xAxes[0].time.max = null;
            $(this).addClass('active');
            engGraph.update();
        });                    
        $("#engagement7Day").click(function(){
            engGraph.options.scales.xAxes[0].time.min = sevenDays;
            engGraph.options.scales.xAxes[0].time.max = latestDate;
            $(this).addClass('active');
            engGraph.update();
        });
        //Et Cetera, et cetera

理想情况下,我想把它变成一个模板,它可以存在于脚本根目录中的一个对象中,我可以用这个图表/图形的名称替换重复元素 - 就像这样:

var graphTemplate = function(currentGraph, currentGraphShort)

        $("#" + currentGraph + "Daily").hide();
        /////
        [currentGraphShort].options.scales.xAxes[0].time.unit = 'day'

但我的实验没有奏效。我看过使用模板文字;但那些似乎更多用于字符串(我可以告诉我们,以及我用过的东西);我试过创建一个像[currentGraphShort]["options"]["scales"]["xAxes[0]"]["time"]["unit"] = 'day'这样的对象也不起作用......

也许这个解决方案非常简单,我忽略了,但是我喜欢这个解决方案!

谢谢=)

编辑:

我尝试在全局根范围中添加我作为函数运行的确切代码,并在图的函数中运行它;但是它无法找到我的图表(engGraph) - 说它是未定义的。也许这也是我缺少的范围因素?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

最后我创建了一个看起来像这样的全局函数:

    function graphInit(graphName, currentGraph, latestDate) {
    //Date formatting
    var sevenDays = moment(latestDate).subtract(7, 'days').format("YYYY-MM-DD HH:mm")
    var thirtyDays = moment(latestDate).subtract(30, 'days').format("YYYY-MM-DD HH:mm")
    var oneWeek = moment(latestDate).subtract(1, 'weeks').format("YYYY-MM-DD HH:mm")
    var twoWeeks = moment(latestDate).subtract(2, 'weeks').format("YYYY-MM-DD HH:mm")
    var fourWeeks = moment(latestDate).subtract(4, 'weeks').format("YYYY-MM-DD HH:mm")
    var threeMonths = moment(latestDate).subtract(3, 'months').format("YYYY-MM-DD HH:mm")
    var sixMonths = moment(latestDate).subtract(6, 'months').format("YYYY-MM-DD HH:mm")
    var oneYear = moment(latestDate).subtract(1, 'years').format("YYYY-MM-DD HH:mm")
    var twoYears = moment(latestDate).subtract(2, 'years').format("YYYY-MM-DD HH:mm")
        //nullify the xAxes scale (Used to default to auto when switching scales)
    function nullXAxes() {
        currentGraph.options.scales.xAxes[0].time.min = null;
        currentGraph.options.scales.xAxes[0].time.max = null;
        $(this).addClass('active');
        currentGraph.update();
    }
    //reset the xAxes scale to specified min/max
    function xAxesScale(min, max) {
        currentGraph.options.scales.xAxes[0].time.min = min;
        currentGraph.options.scales.xAxes[0].time.max = max;
        $(this).addClass('active');
        currentGraph.update();
    }

    //init scaling
    $("#" + graphName + "Daily,#" + graphName + "Weekly,#" + graphName + "Monthly,#" + graphName + "Yearly").hide();
    //left-side click parameters
    $("#" + graphName + "Auto").click(function() {
        currentGraph.options.scales.xAxes[0].time.unit = null;
        $("#" + graphName + "Daily,#" + graphName + "Weekly,#" + graphName + "Monthly,#" + graphName + "Yearly").hide();
        nullXAxes();
    });
    $("#" + graphName + "Day").click(function() {
        currentGraph.options.scales.xAxes[0].time.unit = 'day'
        $("#" + graphName + "Weekly,#" + graphName + "Monthly,#" + graphName + "Yearly").hide()
        $("#" + graphName + "Daily").fadeIn();
        nullXAxes();
    });
    $("#" + graphName + "Week").click(function() {
        currentGraph.options.scales.xAxes[0].time.unit = 'week'
        $("#" + graphName + "Daily,#" + graphName + "Monthly,#" + graphName + "Yearly").hide()
        $("#" + graphName + "Weekly").fadeIn();
        nullXAxes();
    });
    $("#" + graphName + "Month").click(function() {
        currentGraph.options.scales.xAxes[0].time.unit = 'month'
        $("#" + graphName + "Daily,#" + graphName + "Weekly,#" + graphName + "Yearly").hide()
        $("#" + graphName + "Monthly").fadeIn();
        nullXAxes();
    });
    $("#" + graphName + "Year").click(function() {
        currentGraph.options.scales.xAxes[0].time.unit = 'year'
        $("#" + graphName + "Daily,#" + graphName + "Weekly,#" + graphName + "Monthly").hide()
        $("#" + graphName + "Yearly").fadeIn();
        nullXAxes();
    });
    //right-side click parameters
    $("#" + graphName + "AutoDay,#" + graphName + "AutoWeek,#" + graphName + "AutoMonth,#" + graphName + "AutoYear").click(function() {
        nullXAxes()
    });
    $("#" + graphName + "7Day").click(function() {
        xAxesScale(sevenDays, latestDate)
    });
    $("#" + graphName + "30Day").click(function() {
        xAxesScale(thirtyDays, latestDate)
    });
    $("#" + graphName + "1Week").click(function() {
        xAxesScale(oneWeek, latestDate)
    });
    $("#" + graphName + "2Week").click(function() {
        xAxesScale(twoWeeks, latestDate)
    });
    $("#" + graphName + "4Week").click(function() {
        xAxesScale(fourWeeks, latestDate)
    });
    $("#" + graphName + "3Month").click(function() {
        xAxesScale(threeMonths, latestDate)
    });
    $("#" + graphName + "6Month").click(function() {
        xAxesScale(sixMonths, latestDate)
    });
    $("#" + graphName + "1Year").click(function() {
        xAxesScale(oneYear, latestDate)
    });
    $("#" + graphName + "2Year").click(function() {
        xAxesScale(twoYears, latestDate)
    });
};

确保在创建图形之后调用graphInit(whateverGraph,currentGraph,latestDate)的函数,并为其分配变量(currentGraph)。这样可以保存至少1/4的代码,并使其更加模块化。