我使用了一个名为AnimOnScroll的库,我在我的页面加载实例化如下:
new AnimOnScroll( this.find('#grid' ), {
minDuration : 0.4,
maxDuration : 0.7,
viewportFactor : 0.2
} );
如代码所示,AnimOnScroll对象实例附加到div
,内容为#grid
。
在AnimOnScroll javascript文件中,在构造函数中调用了另一个库(masonry)(我删除了选项部分以使其在此处阅读简单):
function AnimOnScroll( el, options ) {
this.el = el;
this._init();
}
AnimOnScroll.prototype = {
_init : function() {
var self = this;
imagesLoaded( this.el, function() {
// initialize masonry
new Masonry( self.el, {
itemSelector: 'li',
transitionDuration : 0
} );
我想访问砌体方法,但我无法找到如何在AnimOnScroll中访问其对象实例。
我设法通过每次重新创建AnimOnScroll的新实例来重新加载项目,但我想学习如何在这种情况下干净地完成它(仍然是javascript的新手)。
感谢您的帮助!
修改
我再试一次测试@Nick L.的答案。事实证明,如果我使用self.prototype.masonry = new Masonry( ...
,我会收到错误:
Uncaught TypeError: Cannot set property 'masonry' of undefined
如果我用self.masonry = new Masonry( ...
替换此行,它可以正常工作。我可以在控制台上显示AnimOnLoad对象,其中砌成了
按照命名变量的方式,我通过记录scroll
得到了这个。如果我尝试记录masonry
(即scroll.masonry
),则会显示为undefined
。
有什么想法吗?
编辑2
在AnimOnScroll的实例化中查看回调日志时,我意识到在渲染页面后创建了对象。这是我的第一个错误,试图在它没有加载时调用它。
我的第二个错误是假设我可以使用没有显示问题的砌体方法。该对象(AnimOnScoll)附加了一个"显示的"每个对象的类来处理转换并跟踪滚动位置。
我必须为每个需要使用的砌体方法重写一个方法。底线:我将选择阻力较小的路径,每次需要刷新时重新创建AnimOnScroll对象实例。这很好。对于那些感兴趣的人,我使用提供显示项集合的帮助器。就在它返回之前,我补充道:
Meteor.setTimeout(function(){
if(typeof scroller!=undefined){scroller= new AnimOnScroll(.......)}
},100);
这样,AnimOnScroll在我的页面更新后立即重新加载并且运行顺畅。
我会验证你的答案,@ Nick L.因为你很高兴帮助我: - )
答案 0 :(得分:2)
为了访问对象方法,您需要以某种方式以某种方式访问对象本身。
我建议你使用Masonry
在对象上添加一个包含self
实例的masonry属性,然后在那里传递构造的对象:
//Warning: Untested code
AnimOnScroll.prototype = {
_init : function() {
var self = this;
imagesLoaded( this.el, function() {
// initialize masonry
self.masonry = new Masonry( self.el, {
itemSelector: 'li',
transitionDuration : 0
} );
}
}
然后,通过执行以下操作访问Masonry
对象:
var scroll = new AnimOnScroll();
var masonry = scroll.masonry;
//etc
编辑:考虑使用调试器或console.log
多次检查,无论是否调用该对象,从调用其构造函数到调用它的位置开始,按顺序调用确保其正确的构造和使用。