我见过人们在famo.us中对Surface
类进行子类化并且它们覆盖deploy
函数的示例。这是famo.us在可渲染物上需要的特殊功能吗?我有一个
我正在构建的“控件”,它有一些我希望在它变得可见时显示的动画,但我不希望它们在我实例化对象时启动,我希望它们在以后向用户显示时显示。这是deploy
函数的用途吗?
答案 0 :(得分:3)
披露:我可能是您见过覆盖部署的许多示例的作者。
当我使用Famo.us并需要将自己的属性添加到本机DOM元素时,我开始介绍Surface中的部署功能。 Deploy接受从ElementAllocator接收的目标元素,该元素管理DOM资源。这是Surface有机会改变任何原始DOM元素的属性以适应提供给Surface的选项。
要回答您的问题,如果您需要在屏幕上显示之前访问原始DOM元素,则只需要覆盖部署功能。但是,您只需要设置元素的不透明度,并且可以使用“deploy”事件上的表面来实现。
以下是使用事件的示例..
var Engine = require('famous/core/Engine');
var Surface = require('famous/core/Surface');
var StateModifier = require('famous/modifiers/StateModifier');
var context = Engine.createContext();
var surface = new Surface({
size:[200,200],
content:"Hello!",
properties: {
backgroundColor:'green',
color:'white',
textAlign:'center',
lineHeight:'200px'
}
})
surface.on('deploy',function(){
console.log("Deployed!");
surface.state.setOpacity(1);
})
surface.state = new StateModifier({ origin:[0.5,0.5]});
surface.state.setOpacity(0);
context.add(surface.state).add(surface);
使用deploy事件时,您还可以看到非常有趣的内容。如果您通过Web控制台或grunt重新加载代码,并且Famo.us应用程序不是当前可见的选项卡,则不会调用部署功能。这是requestAnimationFrame的一个功能,它允许它不花费周期更新不可见的屏幕。当您最终打开选项卡时,您可以看到“已部署!”登录到控制台。
希望这有帮助!
答案 1 :(得分:2)
我不确定是否覆盖了部署方法,但我认为您正在寻找的是“部署”事件。
当曲面添加到实时dom时,确实会触发'deploy'事件。因此,对于您希望在表面位于dom树之后运行的代码:
var surface = new Surface({content: 'foo'})
surface.on('deploy', function() {
// your code that requires surface to be in the dom
});
我不是一个famo.us开发者,所以这不是一个'官方'的答案,但我确实在源代码中看到了它并且已经开始使用它并且它有效。
来源:https://github.com/Famous/core/blob/35461b36c8d09d39e96c3d61ebd7908946d3f668/Surface.js#L451