【问题标题】:Exploring Implements/Extends in MooTools在 MooTools 中探索工具/扩展
【发布时间】:2009-05-30 22:26:07
【问题描述】:

我正在研究一些效果和东西来处理类/实现/扩展。这里的示例是针对基类(MooSlidesFx、MooSlidesFx.Elements)和两个子类(MooSlidesFx.Fade、MooSlidesEffects.Elements.Fade)来创建我正在处理的项目的许多效果的。

http://paste.mootools.net/m6afc7746

第一个类 MooSlidesFx 为其他人设置东西,旨在实现。

第二个类,MooSlidesFx.Elements,扩展了 MooSlidesFx 以同样被实现,但不仅仅是动画传入的元素,它会按顺序动画它的孩子(现在不是在寻找课程链,但它是我的下一个列表!),因此重新定义了一些方法。

第三类 MooSlidesFx.Fade 效果很好。它实现了 MooSlidesFx,定义了两个小方法,然后我们就开始比赛了。

然后是问题。 似乎我可以同时实现 MooSlidesFx.Elements 和 MooSlidesFx.Fade 和 POW!我有一个新效果,它不会淡入元素,而是淡入它的子元素交错。

不是这样,感谢您的帮助!

这里有一大堆代码:

var MooSlidesFx = new Class({

    Implements: Options,

        options: {
            delay: 0,
            duration: 500,
            how: 'in',
            transition: 'sine:in:out'
        },

    initialize: function(el,options){
        this.setOptions(options);
        this.el=$(el);
        this.animation = this.setAnimation(el);
    },

    animate: function(){

        this.animation.set($clear);
        var calculations = this.calculate(this.el);
        this.animation.set(calculations[0]);

        var delayed = function(){ 
            this.animation.start(calculations[1]) 
        }.bind(this).delay(this.options.delay);

    },

    getDuration: function(){
        return this.options.delay+this.options.duration
    }

});

MooSlidesFx.Elements = new Class({

    Extends: MooSlidesFx,

        options: {
            selector: false,
            elementDelay: 200,
            order: 'normal'
        },

    animations: [],

    initialize: function(el,options){
        console.log('Elements initialize');
        this.parent(options);

        this.elements=this.el.getElements(this.options.selector);

        this.elements.each(function(el,index){
            this.animations.include(this.setAnimation(el,index));
        }.bind(this));

    },

    animate: function(){

        var eachDelay = this.options.elementDelay;
        var calculations=[];

        this.animations.each(function(animation,index){
            animation.set($clear);
            calculations.include(this.calculate(index));
            animation.set(calculations[0]);
        }.bind(this));

        var delayed = function(){
            this.elements.each(function(el,i){
                var go = function(){
                    console.log('going '+i)
                    this.animations[i].start(calculations[i][1]);
                }.bind(this).delay(d);
                eachDelay = eachDelay + this.options.elementDelay;
            }.bind(this));
        }.bind(this).delay(this.options.delay);

    },

    getDuration: function(){
        return this.options.delay+this.options.duration+((this.elements.length-1)*this.options.elementDelay);
    }

});

MooSlidesFx.Fade = new Class({

    Implements: MooSlidesFx,

    setAnimation: function(el){
        var animation = new Fx.Tween(el,{ 
            property: 'opacity',
            duration: this.options.duration,
            transition: this.options.transition,
        });
        return animation;
    },

    calculate: function(el){
        return (this.options.how=='in') ? [0,1] : [1,0];
    }

});

MooSlidesFx.Elements.Fade = new Class({

    Implements: [MooSlidesFx.Fade,MooSlidesFx.Elements]

    // TypeError: Result of expression 'this.caller._owner.parent' [undefined] is not an object.
    // mootools-core.js (line 1173) 
});


MooSlidesFx.Elements.Fade = new Class({

    Implements: MooSlidesFx.Fade,
    Extends: MooSlidesFx.Elements

    // TypeError: Result of expression 'this.setAnimation' [undefined] is not a function.
    // MooSlides.Fx.js (line 15)
});


MooSlidesFx.Elements.Fade = new Class({

    Implements: [MooSlides.Fx.Fade, MooSlidesFx.Elements]

    // line 49 is never logged, so Elements isn't ever initialized, acts just like MooSlidesFx.Fade
});


/***** usage *****/

var fx = new MooSlidesFx.Elements.Fade('test',{ selector: 'li'}).animate();


/* 

HTML

<ul id="test">
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
</ul>

*/

【问题讨论】:

  • 实际上,我认为我需要重新定义 MooSlidesFx.Fade 而不实施 MooSlidesFx。然后编写一个实现 Fade 和 MooSlidesFx 的类,然后编写另一个实现 Fade 和 MooSlidesFx.Elements 的类。

标签: javascript class mootools oop


【解决方案1】:

问题出在 MooSlidesFx.Elements 尝试扩展 MooSlidesFx 时。仍然不知道为什么,但我现在不在乎。

我意识到我在 MooSlidesFx.Elements 中扩展了 MooSlidesFx 并重新编写了每个方法。我从中得到的唯一重用是 this.el 和一些选项。

所以...我将它们分成 MooSlidesFx.Element 和 MooSlidesFx.Elements。

然后我创建了一个库 MooSlidesFx.lib 并将 Fade 类存储在那里 (MooSlidesFx.lib.Fade)。

现在我可以:

MooSlidesFx.Fade = new Class({
    Implements: [MooSlidesFx.lib.Fade, MooSlidesFx.Element]
});

MooSlidesFx.Fade.Elements = new Class({
    Implements: [MooSlidesFx.lib.Fade, MooSlidesFx.Elements]
});

这太棒了。我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多