如果我创建一个famo.us表面,其大小为[true,true] 并将一些任意的html内容放入其中, 是否有一种干净的方法来检索对象的大小?
surface.getSize()
只返回相同的[true,true]
我注意到有一些显然是私有的方法,例如:
s._currTarget.clientHeight
但似乎在使用它们时遇到麻烦!
答案 0 :(得分:3)
有几种方法可以解决这个问题。 Famo.us知道这个限制,它应该在优先级列表上相当高..
在此示例中,创建了一个新的表面类,它在deploy函数中或渲染曲面时发出事件。我确定在构造期间获取对原始部署函数的引用,以便稍后可以正常调用。收到渲染事件后,您可以按照自己的意愿编辑曲面。
祝你好运!
var Engine = require('famous/core/Engine');
var Surface = require('famous/core/Surface');
var StateModifier = require('famous/modifiers/StateModifier');
var EventHandler = require('famous/core/EventHandler');
function MySurface(options) {
Surface.apply(this, arguments);
this._superDeploy = Surface.prototype.deploy;
}
MySurface.prototype = Object.create(Surface.prototype);
MySurface.prototype.constructor = MySurface;
MySurface.prototype.deploy = function deploy(target) {
this._superDeploy(target);
this.eventHandler.trigger('surface-has-rendered', this);
};
var context = Engine.createContext();
var event_handler = new EventHandler();
event_handler.on('surface-has-rendered', function(surface){
var size = surface.getSize();
var width = (size[0] == true) ? surface._currTarget.offsetWidth : size[0] ;
var height = (size[1] == true) ? surface._currTarget.offsetHeight : size[1] ;
surface.setSize([width,height]);
console.log(surface.getSize());
})
var surface = new MySurface({
size: [true,true],
content: "Hello",
properties: {
color: 'white',
textAlign: 'center',
padding: '20px',
backgroundColor: 'green'
}
})
surface.pipe(event_handler);
context.add(new StateModifier({origin:[0.5,0.5]})).add(surface);
答案 1 :(得分:2)
将true
传递到.getSize
目前会返回Surface
的DOM大小。
surface.getSize(true)
答案 2 :(得分:2)
获取曲面实际大小的最简单方法是surface.getSize(true)
。您不需要子类Surface。
但是,如果曲面尚未渲染到DOM,则会出现错误。渲染表面时,它将发出“部署”事件。你可以这样听:
surface.on('deploy', function () {
// Your Code Here
}.bind(this));
您很可能还必须将代码包装在Timer.setTimeout()
中。这是因为surface.getSize(true)
方法将比下一个渲染周期(每秒60帧或每周期约16毫秒)执行得更快。最终代码如下所示:
// With the rest of your require statements
var Timer = require('famous/utilities/Timer');
surface.on('deploy', function () {
Timer.setTimeout( function () {
// Your code here
// this.surface.getSize(true)
}.bind(this), 16);
}.bind(this));
我也是Famo.us的新手,但我不得不在我的项目中针对一些不同的情况实施此修复程序,它似乎完美无缺。
让我知道它是否适合你。