Backbone.js 强调向后兼容性

Backbone.js 强调向后兼容性,backbone.js,underscore.js,Backbone.js,Underscore.js,我正在尝试在较新的rails应用程序中使用较旧版本的下划线(1.2.0)制作的主干应用程序,该应用程序加载了较新版本的下划线(rails gem上当前版本的主干附带的下划线),因此这是一个向后兼容性问题,即使在changelog的帮助下,我也无法弄清楚这一点,然而,当我试图保存数据时,它就会发生 背景: 由companys集合创建的公司正试图保存(使用setBucket函数)它所包含的Bucket的id(请参见下面的代码) 这是我在尝试保存数据时遇到的错误 错误 <error>

我正在尝试在较新的rails应用程序中使用较旧版本的下划线(1.2.0)制作的主干应用程序,该应用程序加载了较新版本的下划线(rails gem上当前版本的主干附带的下划线),因此这是一个向后兼容性问题,即使在changelog的帮助下,我也无法弄清楚这一点,然而,当我试图保存数据时,它就会发生

背景:

由companys集合创建的公司正试图保存(使用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 underscore = _.noConflict();
将下划线的版本别名为
下划线
变量(如果愿意,当然可以使用其他别名)。然后在所有现有下划线上运行查找/替换,使用代码将“
”替换为“
下划线”
”(或您的别名)

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

*编辑*

好的,这里有更多的背景。在Javascript中(正如我相信在Ruby中一样),函数是一流的对象。这意味着从技术上讲,
\uu
不是下划线函数本身,它只是一个指向“true”下划线函数(本身是一个对象)的变量。这也意味着您可以像处理任何其他变量一样为函数生成别名。正如您所能做的:
var a=5;var b=a
您也可以执行
var b=\b.map()
或其他任何事情。嗯,差不多,;因为下划线保留对下划线的内部引用,所以需要更新它,这就是
noConflict
的作用所在;这段代码应该是:
var b=u.noConflict()

顺便说一句,这也意味着,如果您愿意,您可以转到另一个方向并更改
\
\=alert_(“你好,世界”)

所以,现在发生的事情是在页面上添加下划线。大概是通过在主html.erb文件中放置一个
来实现的。这带来了下划线版本#1。然后加载Rails应用程序;我不确定这是如何工作的,因为这取决于你的应用程序,但不知怎么的,该应用程序在页面上放置了另一个脚本标记,指向下划线版本2

这是一个问题,因为下划线版本#2刚刚替换了您的版本#1(与我刚才用
警报
替换
的方式相同)。这会破坏你的代码。您可以通过在Rails应用程序中的标签后添加
标签来修复它。这将还原版本#1并修复您的代码。。。但要破坏应用程序的代码


你真正想要的是你的代码使用版本1,你的应用程序代码使用版本2。这就是我最初的答案:通过将
的版本1重新别名为
下划线
(或任何其他内容),Rails应用程序可以继续将版本2引用为
,而您的代码可以继续使用版本1作为
下划线

,实际的错误消息是什么?只是“错误”?@muistoshort是的,看起来“mu(ch)太短了”你不觉得吗?我想我必须改名以避免双关语:)@muistoshort我认为这一步太过激烈了,不值得采取谢谢,但我有点困惑,因为我缺乏经验,而且你对下划线的各种引用。。。“只需加载你的版本…”你的rails应用程序和它的下划线版本“”你的库的版本…”你的下划线使用代码“…你能编辑一下你的答案吗?让我和其他人更清楚。我在rails中安装了最新版本,还有一个使用1.2.0的主干应用程序,我正在尝试将其集成到rails应用程序中。此外,您说我可以同时运行两个版本的下划线,但查找和替换的目的不是让应用程序中只有一个版本吗?查找和替换是让您的所有代码都使用“版本1”的下划线。您的Rails应用程序仍然需要“版本2”,在我建议的解决方案下,它将能够以
\uuuu
的身份访问该版本。我编辑了我的答案来澄清。
setBucket: function(bucketId) {
this.save({bucket: bucketId}, {silent: true});   #the function that's not working
var underscore = _.noConflict();