gpt4 book ai didi

javascript - 使用 Ractive.extend() 时如何引用 DOM 元素?

转载 作者:行者123 更新时间:2023-11-28 06:02:22 25 4
gpt4 key购买 nike

因此,如果我使用 Ractive.extend() 实例化自定义类的对象,那么我将如何引用该类中的 DOM 元素?显然我不能像往常一样使用 document.getElementById() ,因为 DOM 尚未渲染,并且将 Ractive.findComponent() 传递给我的构造函数会返回“Ractive.findComponent 不是函数”。我想做的是这样的:

class myClass {
constructor(id /*,...*/) {
this.element = document.getElementById(id); //how do I do this??
};
};

var Extended = Ractive.extend( {
oninit() {
var myObject = new myClass(id /*,...*/);
this.set({myObject});
}
});

var ractiveExtended = new Extended({
el: document.body,
template: '#template',
data: { id: myId}
});

预计到达时间:这也不起作用...

class myClass {
constructor(id /*,...*/) {
this.element = document.getElementById(id);
};
};

var Extended = Ractive.extend( {
onrender() {
var myObject = new myClass(id /*,...*/);
this.set({myObject});
}
});

var ractiveExtended = new Extended({
el: document.body,
template: '#template',
data: { id: myId}
});

这也不是......

class myClass {
constructor(id /*,...*/) {
this.element = id;
this.element.innerHTML = 'Hello world!';
};
};

var Extended = Ractive.extend( {
onrender() {
var myObject = new myClass(document.getElementById(id) /*,...*/);
this.set({myObject});
}
});

var ractiveExtended = new Extended({
el: document.body,
template: '#template',
data: { id: myId}
});

最佳答案

编辑:完整的运行示例位于:http://jsbin.com/vuziyepeku/edit?html,js,output

我会将每个 CanvasSprite 封装在它自己的组件中:

const CanvasSpriteComponent = Ractive.extend({

template: '#sprite',

// Using onrender, not oninit, because we need DOM canvas node
onrender(){
const canvas = this.find('canvas');
const repeater = this.get('repeater');

var sprite = new CanvasSprite(canvas, repeater.width, repeater.height, repeater.spriteSheetURL, repeater.rows, repeater.columns, repeater.totalFrames);
sprite.left = repeater.left; //add variables *not* in the constructor
sprite.setFrame(0);

this.on('setFrame', function (event) {
var offsetY = event.original.clientY - event.node.getBoundingClientRect().top;
var relY = offsetY/sprite.height;
sprite.setFrame(relY);
});
}
});

然后在主实例中使用它:

var CanvasAnimation = Ractive.extend( {
template: '#animation',
components: {
'canvas-sprite': CanvasSpriteComponent
}
});

var canvasAnimation = new CanvasAnimation({
el: 'main',
data: { repeaters: repeater }
});

可以说,您的 CanvasSprite 类采用 Canvas 节点更有意义,因为这样它就不再依赖于该节点的如何定位(当前 document .getElementById)。

如果您根本不愿意更改该类,则只需创建一个唯一的 id(或者如果转发器集合不会发生变化,则使用索引)。在本例中,我将重用组件的唯一 ID:

const CanvasSpriteComponent = Ractive.extend({
// ...
onrender(){
const canvas = this.find('canvas');
canvas.id = `canvas-${this._guid}`
const repeater = this.get('repeater');

var sprite = new CanvasSprite(canvas.id, repeater.width, repeater.height, repeater.spriteSheetURL, repeater.rows, repeater.columns, repeater.totalFrames);
sprite.left = repeater.left; //add variables *not* in the constructor
sprint.setFrame(0);

this.on('setFrame', function (event) {
var offsetY = event.original.clientY - event.node.getBoundingClientRect().top;
var relY = offsetY/sprite.height;
sprite.setFrame(relY);
});
}
});

关于javascript - 使用 Ractive.extend() 时如何引用 DOM 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37180746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com