从0开发一个大玩具(十一)

第九篇中我们使用路由控制器成功的加载出了welcome.html到页面上
不过welcome是欢迎页,一个软件的制作还是要从工作区开始制作

开始制作工作区

工作区是这个项目的核心,先从核心开始制作,后续的其余功能围绕核心功能来实现
暂时的设想是工作区布局和webstrom布局类似
左侧有一个功能栏目,点击功能栏目中的按钮会弹出一个功能区,中间是编辑区,后面可能会考虑在右边放一个设置区

开发工作区页面

./src/component中增加layout.html文件

<div class="layout">
    <div class="side-bar"></div>
    <div class="left side-view"></div>
    <div class="center working-view"></div>
</div>

side-bar为最左侧功能栏
side-view为左侧功能栏弹出的功能区
working-view为中间工作区

实现工作区控制器

./src/controller中增加
layout.controller.ts
woringview.controller.ts
sidebar.controller.ts
这三个文件

// layout.controller.ts
import BaseController from './base.controller';
import * as $ from 'jquery';
import html from '../component/layout.html';
import WorkingviewController from './workingview.controller'
import {pageOption} from '../interface/pageOption.interface'
import SidebarController from "./sidebar.controller";

export default class LayoutController extends BaseController{

    private option: pageOption;

    constructor(option: pageOption) {
        super();
        this.option = option;
        this.init();
    }

    private init(){
        $(this.option.el).html(<string>html);
        let workingView = new WorkingviewController('.working-view');
        let sidebar = new SidebarController('.side-bar');
    }

}

将页面渲染到页面中,不要忘记修改路由配置,让layout.html默认加载到页面中

// routerConfig.class.ts

//...
private static readonly pageList = [
    {name: '/welcome', controll: WelcomeController},
    {name: '/', controll: LayoutController}
];
//...


实现左边功能栏控制器

// sidebar.controller.ts

import BaseController from './base.controller';
import * as $ from 'jquery'
type sidebarItem = {
    name: string,
    controller: any,
    icon: string,
    show: boolean,
}
export default class SidebarController extends BaseController {
    private readonly el:string;
    private targetInstance: any;
    private targetIndex: number;
    public static readonly sidebarItemList:sidebarItem[] = [

    ];
    constructor(el:string){
        super();
        this.el = el;
        this.init();
    }

    private init(){
        
    }

基础代码实现了之后,我们就需要考虑这个功能栏需要有哪些功能了
从功能呢角度分析,左边的功能栏需要有一个可配置的标签数组,这一点在代码中已经有了实现 sidebarItem用来储存配置的功能标签
鼠标移入标签要有一个高亮的效果,点击某一个标签会弹出对应标签的功能区,功能区处于激活状态时标签也要处于高亮状态,鼠标移入的高亮我们可以考虑使用css的hover来实现,点击之后给标签加一个active的class,点击的同时还需要实例化对应功能区的控制器,接下来开始实现具体代码

暂定功能标签有:组件库 图层

  • 组件库:包含所有可选组件
  • 图层:可以快速分析元素层级关系

sidebarItem中增加配置

    public static readonly sidebarItemList:sidebarItem[] = [
        {name: '组件库', controller: ItemviewController, icon: 'fa-home', show: true},
        {name: '图层', controller: LayersController, icon: 'fa-files-o', show: true},
    ];

渲染方法

    private renderList(){
        let renderString = '';
        for(let k of SidebarController.sidebarItemList){
            if(!k.show) continue;
            let str = `<div class="side-bar-item">
                    <i class="fa ${k.icon}"></i>
                    ${k.name.split('').map(v => `<span>${v}</span>`).join('')}
            </div>`;
            renderString += str;
        }
        $(this.el).append(renderString);
    }

点击每个标签便签会弹出功能区,也就是说,每个功能区控制器渲染元素是渲染到同一个标签中的,那么控制这个标签弹出收起的方法,我们单独抽离出来

    public openOrCloseSideView(type: 'open' | 'close') {
        if (type === 'open') {
            $('.side-view').css('width', '300px');
        } else if (type === 'close') {
            $('.side-view').css('width', '0px');
        }
    }

接下来给每个元素绑定点击事件

    private bindEvent() {
        let parentNode = $(this.el);
        let sonNode = parentNode.find('.side-bar-item');
        sonNode.each((i, v) => {
            $(v).on('click', () => {
                sonNode.each(function (ii, vv) {
                    $(vv).removeClass('active');
                });
                if (this.targetIndex === i) {
                    this.targetInstance && this.targetInstance.destory();
                    this.targetIndex = -1;
                    this.openOrCloseSideView('close');
                } else {
                    $(v).addClass('active');
                    this.targetInstance && this.targetInstance.destory();
                    this.targetInstance = new SidebarController.sidebarItemList[i].controller('.side-view');
                    this.targetIndex = i;
                    this.openOrCloseSideView('open');
                }
            })
        });
    }

renderList中调用

    private renderList(){

        // ...
        this.bindEvent(); // 绑定点击事件
    }

这样点击方法就完成了,下一篇我们继续开发左边功能区
放一张现阶段效果图


image.png

此致
敬礼~
小旋风

我建了一个前端微信交流群,欢迎大家加入,qq中转群号:1076484243

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352