美文网首页
界面上的有限状态机(一)

界面上的有限状态机(一)

作者: 寻找无名的特质 | 来源:发表于2020-12-22 06:13 被阅读0次

如果Web界面中涉及若干状态以及状态之间的转换,采用有限状态机管理界面可以使代码结果更清晰、更容易管理,也更容易描述。界面的状态表现为若干控件的使能、可见性或者其它视觉属性,状态之间的转换通常为事件驱动,比如点击按钮、选择下拉框等等。有限状态机的作用就是将状态和状态转换抽象出来,与具体的状态表现分离,使代码结构更加清楚。这里介绍一款有限状态机https://github.com/jakesgordon/javascript-state-machine,基于Javascript,使用起来非常简单。下面是简单的示例代码:

<!DOCTYPE html> 
<html>
<head>
  <title>Javascript Finite State Machine</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
  <style>
      .opened {background:yellow}
      .closed {background:black}
  </style>
</head> 
 
<body> 

  <div >
    <div id="controls">
        <button id="open" onclick="Demo.open();">打开</button>
        <button id="close"  onclick="Demo.close();">关闭</button>
       
      </div>

    <div id="diagram" style="width: 200px; height: 200px;">
    </div>

    <textarea id="output">
    </textarea>

  </div>


  <script src="dist/state-machine.js"></script>
  <script src="js/demo.js"></script>

</body> 
</html>

demo.js代码如下:

Demo = function() {

    var output = document.getElementById('output'),
    diagram = document.getElementById('diagram'),
    open  = document.getElementById('open'),
    close   = document.getElementById('close')
        count  = 0;
  
    var log = function(msg, separate) {
      count = count + (separate ? 1 : 0);
      output.value = count + ": " + msg + "\n" + (separate ? "\n" : "") + output.value;
      refreshUI();
    };
  
    var refreshUI = function() {
      setTimeout(function() {
        diagram.className = fsm.state;
        open.disabled = fsm.cannot('open', true);
        close.disabled  = fsm.cannot('close',  true);
        
      }, 0); // defer until end of current tick to allow fsm to complete transaction
    };
  
    var fsm = new StateMachine({
  
      transitions: [
        { name: 'start', from: 'none',   to: 'closed'  },
        { name: 'open',  from: 'closed',  to: 'opened' },
        { name: 'close', from: 'opened',  to: 'closed'    }
      ],
  
      methods: {
        
  
        onBeforeTransition: function(lifecycle) {
          log("BEFORE: " + lifecycle.transition, true);
        },

        onLeaveState: function(lifecycle) {
          log("LEAVE: " + lifecycle.from);
        },
  
        onEnterState: function(lifecycle) {
          log("ENTER: " + lifecycle.to);
        },
  
        onAfterTransition: function(lifecycle) {
          log("AFTER: " + lifecycle.transition);
        },
 
        onTransition: function(lifecycle) {
          log("DURING: " + lifecycle.transition + " (from " + lifecycle.from + " to " + lifecycle.to + ")");
        },
  
         
  
      }
    });
  
    fsm.start();
    return fsm;
  
  }();

相关文章

  • 界面上的有限状态机(一)

    如果Web界面中涉及若干状态以及状态之间的转换,采用有限状态机管理界面可以使代码结果更清晰、更容易管理,也更容易描...

  • 界面上的有限状态机(三)

    前面介绍了状态和转移的基本用法,还有一些针对复杂场景的高级功能,这里介绍一下。 状态通配符“*” 前面我们提到了,...

  • 界面上的有限状态机(四)

    前面介绍了有限状态机的状态和转换,具体界面响应是在状态转换时进行的,比如如果用户按了按钮,某些控件会不可见,这些动...

  • 界面上的有限状态机(六)

    界面状态机本身不记录历史状态,如果需要查看状态的转换历史,或者需要回滚等功能,可以使用插件。如果在浏览器中使用,可...

  • 界面上的有限状态机(二)

    前面介绍了Js开发的有限状态机,这里介绍一下这个有限状态机涉及的基本概念——状态(State)和转移(Transi...

  • 界面上的有限状态机(五)

    前面介绍了有限状态机状态转换时激发的事件,这些事件可以在状态机methods种定义捕获函数,这些函数会传入一个li...

  • 界面上的有限状态机(八)

    前面我们创建一个有限状态机都是直接使用构造函数,比如: 如果我们希望创建多个定义相同的有限状态机实例,我们可以使用...

  • 界面上的有限状态机(七)

    前面介绍了界面有限状态机https://github.com/jakesgordon/javascript-sta...

  • 有限状态机与JavaScript

    有限状态机与JavaScript 有限状态机是一种很有用的编程模型,简单来说,我理解的有限状态机一个显著的作用是降...

  • cocos creator主程入门教程—— 有限状态机和行为树

    本篇介绍有限状态机和行为树。有限状态机用于有限的状态下的AI,由于同时只能处于一个状态,多个状态需要多个有限状态机...

网友评论

      本文标题:界面上的有限状态机(一)

      本文链接:https://www.haomeiwen.com/subject/kxzhnktx.html