0

我正在尝试使用一个用旧版本的下划线(1.2.0)制作的主干应用程序,该应用程序在一个新的rails应用程序中加载了更新版本的下划线(当前版本的主干附带的下划线-on-rails gem),所以这是一个向后兼容性问题,即使在更改日志http://underscorejs.org/#changelog的帮助下我也无法弄清楚,但是,当我试图保存数据。

语境:

由 Companies 集合创建的 Company 正在尝试保存(使用 setBucket 函数)它所在的 Bucket 的 ID(参见下面的代码)。

这是我尝试保存数据时遇到的错误。

错误

<error>
    _.extend
    _.clone
    _.extend.toJSON
    _.extend.save
    _.extend.update
    Backbone.sync
    _.extend.sync
    _.extend.save
    window.Company.Backbone.Model.extend.setBucket
    window.AppView.Backbone.View.extend.createCompanyOnEnter
    jQuery.event.dispatch
    elemData.handle.eventHandle

源代码

...(代码省略)...

  var company = Companies.create({text: text});    #this works. company is created
  company.setBucket(initialBucket.id);    #this triggers the error

....(代码省略)

setBucket: function(bucketId) {
this.save({bucket: bucketId}, {silent: true});   #the function that's not working
4

1 回答 1

1

您可以同时运行两个版本的 Underscore。只需先在页面上加载您的 Underscore 版本,然后添加以下行:

var underscore = _.noConflict();

将您的 Underscore 版本别名为underscore变量(如果您愿意,当然可以使用不同的别名)。然后在所有现有的下划线使用代码上运行查找/替换,将“ _”替换为“ underscore”(或您的别名)。

最后,将您的 Rails 应用程序及其版本的 Underscore 加载到页面。它将获得_别名,并且您的代码可以使用它的版本而不会影响您的库的版本。

* 编辑 *

好的,这里有一点背景。在 Javascript 中(就像我相信在 Ruby 中一样),函数是一流的对象。这意味着从_技术上讲,它不是 Underscore 函数本身,它只是一个指向“真正的”Underscore 函数(它本身就是一个对象)的变量。这也意味着您可以像使用任何其他变量一样为函数创建别名。就像你可以做的那样:var a = 5; var b = a你也可以做var b = _;,然后你可以做b.map()或其他任何事情。好吧,几乎;因为Underscore保留了对Underscore的内部引用,所以需要更新它,这就是noConflict进来的地方;该代码确实应该是:var b = _.noConflict();

顺便说一句,这也意味着你可以去另一个方向改变_,如果你愿意:_ = alert; _('hello world')

因此,您目前正在发生的事情是您将下划线引入您的页面。大概您是通过<script src='underscore.js'></script>在主 html.erb 文件中放置一个来执行此操作的。这带来了下划线版本#1。然后你加载你的 Rails 应用程序;我不确定这是如何工作的,因为它取决于您的应用程序,但不知何故,该应用程序在页面上放置了另一个脚本标签,指向下划线版本 #2。

这是一个问题,因为 Underscore 版本 #2 刚刚替换了您的版本 #1(与我刚才替换的方式相同_alert。这会破坏您的代码。您可以<script>通过在 Rails 应用程序的标签之后添加标签来修复它。这将恢复版本 #1 并修复您的代码……但会破坏您的应用程序代码。

您真正想要的是您的代码使用版本#1,而您的应用程序代码使用版本#2。这就是我最初的答案所在:通过重新为_to underscore(或其他任何东西)的版本 #1 重新别名,您的 Rails 应用程序可以继续将版本 #2 引用为_,并且您的代码可以继续使用版本 #1 作为underscore

于 2013-01-08T04:39:11.987 回答