2012-05-17 124 views
0

嗨(模型的instanceof模型),Backbone.js的通过Chrome扩展

这是我第一次张贴在这个网站,我要提出的问题是困难的,因为阐明该组变量需要达到它。让我快速解释我正在使用的框架。

我使用jQuery,jQuery的UI,和骨干

整个JS套件扩展是写在CoffeeScript中,我使用Rails和资产管道来管理其全部建立一个Chrome扩展。这意味着当我想部署我的扩展代码时,我运行rake assets:precompile并将生成的压缩JS复制到我的扩展目录。

这种方法的好处是我可以通过包含库来实际运行Rails应用程序中的扩展js。这与我的扩展background.js文件基本相同,后者将js注入为内容脚本。

无论如何,我最近遇到的问题是,当我尝试在我的好友的网站whiskeynotes.com上测试我的扩展。

我注意到的是,我的主干模型在将它们添加到它们各自的集合中时正在被损坏。因此,像

this.collection.add(new SomeModel)

创建了模型的一些废话版本。

该代码最终运行到骨干prepareModel代码现在

_prepareModel: function(model, options) {                           
    options || (options = {}); 
    if (!(model instanceof Model)) { 
    var attrs = model; 
    options.collection = this; 
    model = new this.model(attrs, options); 
    if (!model._validate(model.attributes, options)) model = false; 
    } else if (!model.collection) { 
    model.collection = this; 
    } 
    return model; 
}, 

,在大多数关于这一点我已经测试了扩展的站点,结果是正常的,但是在我的好友的网站!(model instance Model)计算结果为真尽管它实际上是正确类的一个实例。结果是模型的超级混乱版本,其中模型的属性是对模型集合的引用(奇怪的权利?)。不用说,各种疯狂的事情发生在后面。

为什么这发生在我身上。然而改变这条线(!(model instanceof Model))(!(model instanceof Backbone.Model))似乎解决了这个问题。我想也许它与Flot库(jQuery图库)有关,它们创建了它们自己的'Model'版本,但是通过源代码查看并没有发现它的任何实例。我只是好奇为什么这会发生。将这个小改动添加到骨干源是否有意义?

更新:

我刚刚意识到 “修复” 实际上并没有正常工作。我还可以补充一点,我的骨架模型在一个包装对象命名空间,这样的声明看起来像class SomeNamespace.SomeModel extends Backbone.Model

回答

0

夫人和绅士我相当肯定我已经解决了这个问题,并没有什么做任何我以前的假设。对于那些对开发Chrome扩展感兴趣的人,请继续阅读,因为这可以为您在将来节省一些麻烦。

我希望我的Chrome扩展能够在用户在最初初始化它的网站中浏览内容脚本时(通过浏览器操作(即url栏旁边的小扩展图标))来运行内容脚本。为了达到这个效果,我使用了chromes chrome.webNavigation.onDOMContentLoaded.addListener(function(details) api。

我不知道的是,这件事实际上是在网页,tweet按钮,g +,facebook喜欢等等加载的每一帧上触发的。所以基本上我的内容脚本在每个框架中加载,对物体和事件造成各种破坏。添加支票details.frameId === 0解决了我的问题。呼!感谢收听!

0

在Chrome扩展清单中,您还可以指定内容脚本仅在顶部框架中运行。只需在内容脚本中指定all_frames属性即可。即,

{ 
    "name": "My extension", 
    ... 
    "content_scripts": [ 
    { 
     "matches": ["http://www.google.com/*"], 
     "css": ["mystyles.css"], 
     "js": ["jquery.js", "myscript.js"], 
     "all_frames": false 
    } 
    ], 
... 
} 

Chrome developer documentation reference