[DikeJS]使用RequireJS开发动态组件(三)

在前几次使用RequireJS创建模板分析工具之后,我现在就要开始使用RequireJS编写组件了,如果我想达到ExtJS那种动态创建组件的效果,我就需要充分考虑组件与组件之间的依赖加载问题(节点渲染)、事件绑定问题、初始化组件问题、组件样式自定义、未设置组件ID时自动生成不重复的ID问题等,因为需要考虑许多问题,因此我暂时没有更好的解决办法,在此,我将我分析的仅有的代码拿出来分享,希望能有高手帮助我解决未能分析到的问题。

待问题分析到二分之一时,我将开放源码,并将源码开放到GitHub上以供分享和重构!

下面,我将暂时分析后的代码进行整理和分享:(注:本示例需要RequireJS环境,目录结构我将在日志中体现出来)

目录结构:

Canvas.js

/**
 * @Author Dike.Li
 * @Copyright: Copyright (c) 2013-2014
 * @Description User Interface Component - Canvas
 */
define(function (require, exports, module) {
    /**
     * 获得模板替换工具
     */
    var template = require(‘Template‘);

    /**
     * 模板定义
     * @type {string}
     */
    var temp = ‘<canvas id="{id}" name="{name}" width="{width}" height="{height}" style="{style}" tag="{tag}"></canvas>‘;

    var Canvas = function (option) {

        /**
         * 将原型模板根据option属性进行翻译
         */
        template = new template(temp, option);
        temp = template.getTemp();

        /**
         * 在option中设置了render属性的则进行翻译后的模板添加
         */
        if (typeof(option.render) !== ‘undefined‘) {
            option.render.append(temp);
        }

        /**
         * 设置事件
         */
        if (typeof(option.listeners) !== ‘undefined‘) {
            for (var listenerName in option.listeners) {
                $(‘#‘ + option.id).on(listenerName, option.listeners[listenerName]);
            }
        }

        /**
         * 注册事件
         * @param name
         * @param fn
         */
        Canvas.prototype.on = function (name, fn) {
            $(‘#‘ + option.id).on(name, fn);
        };

        /**
         * 获取 getContext2D
         * @returns {CanvasRenderingContext2D}
         */
        Canvas.prototype.getContext2D = function () {
            var ctx = $(‘#‘ + option.id)[0].getContext(‘2d‘);
            return ctx;
        };

        /**
         * 获取 Canvas Element
         * @type {string}
         */
        Canvas.prototype.el = temp;

        /**
         * 监听画布加载完成后的事件
         */
        //$(‘#‘ + option.id).ready(function () {
        //    if (typeof(option.onReady) !== ‘undefined‘) {
        //        option.onReady(Canvas.prototype);
        //    }
        //});
    };

    module.exports = Canvas;
});

app.js

requirejs.config({
    paths: {
        jquery   : ‘lib/jquery-1.11.1.min‘,
        Template : ‘Component/util/Template‘,
        Button   : ‘Component/view/button/Button‘,
        Canvas   : ‘Component/view/canvas/Canvas‘,
        Container: ‘Component/view/container/Container‘
    }
});

define(function (require) {
    var $ = require(‘jquery‘);

    //var container = new (require(‘Container‘))({
    //    id    : ‘container‘,
    //    name  : ‘container‘,
    //    width : ‘300px‘,
    //    height: ‘500px‘,
    //    render: $(‘body‘)
    //});

    var canvas = new (require(‘Canvas‘))({
        id       : ‘Canvas‘,
        name     : ‘Canvas‘,
        render: $(‘body‘),
        listeners: {
            click: function () {
                alert(1);
            }
        }
    });

    //container.add(canvas);
    //
    var ctx = canvas.getContext2D();
    ctx.fillStyle = ‘#FF0000‘;
    ctx.fillRect(0, 0, 80, 100);
});

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <script data-main="app.js" src="lib/RequireJS.js"></script>
</head>
<body>

</body>
</html>

通过观察上面的代码会发现,声明的 Canvas 组件在创建时,必须要将内容渲染到html中,否则,Canvas 中的 getContext2D() 的方法则无法使用,如果根据Canvas创建一个同样的组件container (div的标签),再对两个组件进行依赖加载(节点依赖渲染)时,必须要按照js代码的执行顺序,否则Canvas同样无法渲染到html中,或者是第一次能够渲染,第二次则无法渲染的问题,如果对Canvas添加了Event,则在顺序不正确的情况下,Event无法响应,针对以上的问题,我会在之后的开发中依次解决并发布文章进行说明,如果您有好的思路,可以发送邮件给我:[email protected] 或者给我留言!

时间: 2024-11-04 22:01:32

[DikeJS]使用RequireJS开发动态组件(三)的相关文章

vue 开发系列(九) VUE 动态组件的应用

业务场景 我们在开发表单的过程中会遇到这样的问题,我们选择一个控件进行配置,控件有很多中类型,比如文本框,下来框等,这些配置都不同,因此需要不同的配置组件来实现. 较常规的方法是使用v-if 来实现,这样界面看上去比较复杂,而且需要进行修改主页面. 解决方案 可以使用动态组件来实现,为了体现动态组件的特性,我们简化实现方式,编写两个简单的组件来测试一下这个功能. 文本组件配置: <template> <div> 我是单行文本框{{config.type}} </div>

iOS开发之组件化架构漫谈

前段时间公司项目打算重构,准确来说应该是按之前的产品逻辑重写一个项目.在重构项目之前涉及到架构选型的问题,我和组里小伙伴一起研究了一下组件化架构,打算将项目重构为组件化架构.当然不是直接拿来照搬,还是要根据公司具体的业务需求设计架构. 在学习组件化架构的过程中,从很多高质量的博客中学到不少东西,例如蘑菇街李忠.casatwy.bang的博客.在学习过程中也遇到一些问题,在微博和QQ上和一些做iOS的朋友进行了交流,非常感谢这些朋友的帮助. 本篇文章主要针对于之前蘑菇街提出的组件化方案,以及cas

18、Cocos2dx 3.0游戏开发找小三之cocos2d-x,请问你是怎么调度的咩

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30478251 Cocos2d 的一大特色就是提供了事件驱动的游戏框架, 引擎会在合适的时候调用事件处理函数,我们只需要在函数中添加对各种游戏事件的处理, 就可以完成一个完整的游戏了. 例如,为了实现游戏的动态变化,Cocos2d 提供了两种定时器事件: 为了响应用户输入,Cocos2d 提供了触摸事件和传感器事件: 此外,Cocos2d 还提供了一系列

C++ 类的动态组件化技术

序言: N年前,我们曾在软件开发上出现了这样的困惑,用VC开发COM组件过于复杂,用VB开发COM组件发现效率低,而且不能实现面向对象的很多特性,例如,继承,多态等.更况且如何快速封装利用历史遗留的大量C++代码本身就是一个大的难题. 当时,开发小组的成员通过共同努力,摸索了一套C++类的动态组件化技术,很好的解决了以上的问题,通过这个技术,我们继承了大量的C++代码,同时使这些C++程序以COM+组件的形式得以新生.通过这几年在实际应用中的考验,这个技术是成熟可靠的. 也许新的系统大多数都完全

个帖子学会Android开发四大组件

黑色幽默Lion 方向比努力重要,能力比知识重要,情商比智商重要! 首页 新闻 新随笔 管理 随笔- 43  文章- 0  评论- 12 一个帖子学会Android开发四大组件 注:本文来自"友盟杯",仅在此阅读,学习 这个文章主要是讲Android开发的四大组件,本文主要分为 一.Activity详解二.Service详解三.Broadcast Receiver详解四.Content Provider详解外加一个重要组件 intent的详解. 一.Activity详解Activty的

使用 CodeIgniter 框架快速开发 PHP 应用(三)

原文:使用 CodeIgniter 框架快速开发 PHP 应用(三) 分析网站结构 既然我们已经安装 CI ,我们开始了解它如何工作. 读者已经知道 CI 实现了MVC式样. 通过对目录和文件的内容进行分类, 而不是让代码大块大块地纠集在一起. 这一章,我们将会对 MVC 理论做个简短的介绍, 然后再介绍 CI 的MVC实现方式.特别地,要了解那些目录和文件如何互相交换信息?网站结构是怎样的?以及CI是如何自如地动作于其中的? 这一章将会介绍: .MVC 如何架构一个动态网站 .CI如何接收和分

Android开发四大组件之Service(实例篇)

关于Service的开发详解已经在上一篇:Android开发四大组件之Service(详解篇)讲的很清楚了,本篇主要对Service的开发实例做下讲解. 程序运行效果图: 程序代码: BindService: package com.jph.servicedemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; /**

微信公众平台开发教程(三) 基础框架搭建

微信公众平台开发教程(三) 基础框架搭建 上一章,我们已经初步讲解了微信公众账号开发的基本原理,今天我们来探索设计实现. 首先我们设计了模块层次图,当然图中只是给出一种实现方式,不局限于此.具体见下图. 主要功能介绍如下: 1)请求接口层.处理HTTP请求,及响应 2)分发层.由接口层传入请求,然后具体分析请求类型,分发至不同的处理器 3)业务逻辑层.这里是我们的具体业务逻辑了,根据请求,实现具体的业务逻辑. 4)数据层.我们在实现某个应用时可能需要访问数据,可以是数据库或者是文件.如果是简单应

14、Cocos2dx 3.0游戏开发找小三之Scene and Layer:一场游戏一场梦

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/30474393 Scene :场景 了解了Director 之后,接下来介绍 Scene 这个与它紧密相关的游戏组件. 通过之前的学习,我们已经了解了场景以及它在流程控制中的地位. 在 Cocos2d-x 中,Scene 定义了一个场景.场景只是层的容器,包含了所有需要显示的游戏元素. 因此相对于其他游戏元素,Scene 并没有提供什么特别的功能,就是一