将功能添加到现有状态' onEnter在SimpleStateManager中并让它们执行

时间:2015-09-04 18:35:36

标签: javascript

我使用Simple State Manager并使用Bootstrap断点设置一组全局状态以匹配项目范围。我这样做是为了让我们一致地使用状态名称,并且可以轻松地使用预定义的断点。

然后我尝试找出一种方法,在页面加载和稍后使用onEnter处理程序的状态更改匹配上添加功能。基本上,我们有页面特定的javascript,它将在匹配媒体查询时添加自己的功能。

我几乎让它工作了;我的问题是我可以让函数在页面加载或状态匹配上运行,但不能同时运行。

这里是设置与我们的Bootstrap断点匹配的媒体查询状态的代码,以及为SimpleStateManager定义媒体查询:

// bootstrap variables
var screenMax = 479,
    screenXsMin=480,
    screenSmMin=768,
    screenMdMin=992,
    screenLgMin=1200,
    screenXsMax=(screenSmMin - 1),
    screenSmMax=(screenMdMin - 1),
    screenMdMax=(screenLgMin - 1);

// Set up strings for queries. These can be used when adding states in custom.js,
var mqScreenMax= 'only screen and (max-width:'+screenMax+'px)',
// Set up an xs min, max, and only
    mqXsMin= 'only screen and (min-width:'+screenXsMin+'px)',
    mqXsMax= 'only screen and (max-width:'+screenXsMax+'px)',
    //mqXsOnly= 'only screen and (min-width:'+screenXsMin+'px) and (max-width:'+screenXsMax+'px)',
// set up a sm min max and only
    mqSmMin= 'only screen and (min-width:'+screenSmMin+'px)',
    mqSmMax= 'only screen and (max-width:'+screenSmMax+'px)',
    //mqSmOnly= 'only screen and (min-width:'+screenSmMin+'px) and (max-width:'+screenSmMax+'px)',
// set up a md min max and only
    mqMdMin= 'only screen and (min-width:'+screenMdMin+'px)',
    mqMdMax= 'only screen and (max-width:'+screenMdMax+'px)',
    //mqMdOnly= 'only screen and (min-width:'+screenMdMin+'px) and (max-width:'+screenMdMax+'px)',
// finalize with a large min
    mqLgMin= 'only screen and (min-width:'+screenLgMin+'px)';

// Add the different states we can test against
ssm.addStates([
    {
        id: 'scr-max',
        query: mqScreenMax
    },
    {
        id: 'xs-min',
        query: mqXsMin
    },
    {
        id: 'xs-max',
        query: mqXsMax
    },
    {
        id: 'sm-min',
        query: mqSmMin
    },
    {
        id: 'sm-max',
        query: mqSmMax
    },
    {
        id: 'md-min',
        query: mqMdMin
    },
    {
        id: 'md-max',
        query: mqMdMax
    },
    {
        id: 'lg-min',
        query: mqLgMin
    }
]);

在特定页面上,我想在匹配我们的" sm-min"时添加一些功能。媒体查询:

ssm.getState('sm-min').options.onEnter.push(
    function() {
        // do stuff
    }
);

如果我向下调整屏幕大小并进行备份,触发onEnter私有功能,则此功能正常。但是,它不适用于页面加载,而如果我在上面的初始ssm.addStates()中定义了onEnter函数,它就会。我假设这是因为我在AFTER SSM中添加了该函数已经实例化,因此它没有运行。所以,为了解决这个问题,我尝试强制它作为IIFE运行:

ssm.getState('sm-min').options.onEnter.push(
    (function() {
        // do stuff
    })()
);

然后按预期工作,立即运行,但在下一场比赛中再也不会运行。

我还试图添加一个函数和一个IIFE,并且无法使其工作。 (很确定这不是有效的数组代码,或使用数组):

ssm.getState('sm-min').options.onEnter.push([
    (function() {
        // do stuff
    }()),
    function() {
        // do stuff
    }
]);

在使用push()添加onEnter函数后,我还没弄清楚如何强制SSM重新执行自己; documentation没有涵盖(并且有点过时)。我在src / ssm.js里面挖了一下,但我认为我的javascript句柄并不是标准的,以便弄清楚如何强制它进入State或重新初始化。

任何人都知道如何添加功能并让它执行并继续执行?

0 个答案:

没有答案