• enyo官方开发入门教程翻译一Key Concepts之Creating Components


    Creating Components

         enyo.Component对象是组成enyo的基本构件。Components封装了丰富的特性,可以作为modeles组合起来使用,创造复杂的应用。当编写enyo应用时,你通常会创建大量自己的componentcontrol kinds

    The Basics

         一个组件是一个Enyokind,它可以发布属性、绑定事件、包含其他组件。可以把组件看做是一个包含其他组件、输入(方法和属性的set方法)、输出(事件和属性的get方法)的集合。一个组件控制自己的content并将信息以事件的形式发送给它的父组件或拥有者。下面是一个示例:

    enyo.kind({

        name: "RandomizedTimer",

        kind: enyo.Component,

        minInterval: 50,

        published: {

            baseInterval: 100,

            percentTrigger: 50

        },

        events: {

            onTriggered: ""

        },

        create: function() {

            this.inherited(arguments);

            this.start();

        },

        destroy: function() {

            this.stopTimer();

            this.inherited(arguments);

        },

        start: function() {

            this.job = window.setInterval(enyo.bind(this, "timer"), this.baseInterval);

        },

        stop: function() {

            window.clearInterval(this.job);

        },

        timer: function() {

            if (Math.random() < this.percentTrigger * 0.01) {

                this.doTriggered({time: new Date().getTime()});

            }

        },

        baseIntervalChanged: function(inOldValue) {

            this.baseInterval = Math.max(this.minInterval, this.baseInterval);

            this.stop();

            this.start();

        }

    });

         正如名字所示,这是一个简单的随机定时器组件。它是一个enyo.Component kind,所以它继承扩展了enyo.Component对象的行为属性。当计时器触发并暴露一些属性时它生成一个事件来控制触发频率。正如你所见,它直接暴露了属性和事件。

    Properties

         公开的属性放在一个“published”块中,可以有默认值。为了方便,公共属性都自动添加了set方法、get方法和changed方法(其中get和set方法由enyo.Object类继承而来,调用set方法会进行判断是否调用changed方法,可以查看enyo/source/kernel/Object.js文件,那里定义了enyo.Object类和该类添加getset方法的代码)。例如setBaseInterval 和setPercentTrigger 可以用来改变计时器的频率。

         当setBaseInterval被调用时,我们的实现需要我们更新定时器触发代码。这有时被称为属性set方法的一个副作用。它实现了baseIntervalChanged方法,当baseInterval的值发生变化时调用setBaseInterval(要表达的意思应该是当baseInterval的值发生变化时调用setBaseInterval,setBseInterval方法内部会对bseInterval进行判断,如果该属性为空则直接赋值,不为空则调用baseIntervalChanged()方法。这里实在翻译不好,怎么都觉得别扭。)。   

         注意,通常需要初始化一个属性值。我们通常通过在create方法中调用属性changed方法来初始化。因为需要在不同情况下初始化,我们把它留给component自己判断。

    Events

         同样,事件被放置在一个“事件”块。触发事件,我们调用相关的“do”方法,enyo提供了另一个便利。例如,为了触发onTriggered事件,我们可以调用doTriggered 方法。 你可以通过“do”的方法来传递一个参数 —— 一个事件对象,该对象将被传递到事件处理程序。在本例中,我们发送当前时间在事件的时间属性。稍后,我们将看到如何处理该事件。

    Components in Components: It's Turtles All the Way Down

    首先我们创建另一个kind,SimulatedMessage:

    enyo.kind({

        name: "SimulatedMessage",

        kind: enyo.Component,

        components: [

            {name: "timer", kind: "RandomizedTimer", percentTrigger: 10,

                onTriggered: "timerTriggered"}

        ],

        timerTriggered: function(inSender, inEvent) {

            this.log("Simulated Service Message Occurred at " + inEvent.time);

        }

    });

         正如您所见,有一个组件和它内部一个配置过的RandomizedTimer。当我们创建一个SimulatedMessage实例,它将创建其中的组件。我们说它拥有这些组件,它负责它们的生命周期。它可以通过使用this.$ hash值来引用这些对象。例如,你可以调用this.$.timer.setPercentTriggered(50)SimulatedMessage组件的使用者不必关心计时器组件。 它的行为是被封装SimulatedMessage内部的。 所有组件对于他们的拥有者来说都是私有的。

    Handling Events

         谈到component处理事件这个话题,我们可以把我们的注意力放在onTriggered事件上。注意在配置“timer”对象时我们为onTriggered事件指定的字符串。它就是SimulatedMessage处理onTriggered事件的方法的名称。

         事件通过配置名称被委托给组件的拥有者。这是我们免去了add/remove监听机制的痛苦。每一个事件的第一个参数是“inSender”,它是对触发事件的组件的引用。这个方法有利于代码重用,因为同样的方法可以用来处理多个由inSender区分的事件。第二个参数是“inEvent”,是一个传递事件属性信息的对象。

    Summary

    回顾。components组件以方法、属性和事件的形式封装了行为和接口的基本构件。

    下一节

    创建Control -- Creating Controls

    创建Kinds -- Creating Kinds

    英文原文地址:https://github.com/enyojs/enyo/wiki/Creating-Components

  • 相关阅读:
    String数组转换成Integer数组
    码云远程仓库用户名和密码修改了,本地如何删除修改?
    Git操作过程(码云)
    SpringCloud应用之配置中心Nacos
    SpringCloud应用之网关GateWay
    SpringCloud应用之熔断器Hystrix
    SpringCloud应用之服务调用Feign
    装饰者设计模式
    Spring 自动装配及其注解
    Spring Bean自动装配有哪些方式?
  • 原文地址:https://www.cnblogs.com/waimai/p/2849842.html
Copyright © 2020-2023  润新知