0

(经过编辑大大简化)

在节点上,我有以下 server.js 文件。

var Backbone = require('backbone');

var Tweet = Backbone.Model.extend({});
var Tweets = Backbone.Collection.extend({
    model : Tweet,
    url: function () {
        return 'http://search.twitter.com/search.json?q=backbone'
}
});

var myTweets = new Tweets();
myTweets.fetch();

当我运行它时,我收到一条错误消息。“无法调用未定义的方法 'ajax'” (1359:14)

基本上这是 $ 未定义的结果。为什么它是未定义的?好吧,有许多中间步骤,但是当文件加载时,它期望“this”是浏览器中的“window”或服务器上的“global”。在节点 "this" = {​​} 上执行。

所以问题,“我如何将'this'设置为全局”在主干.js文件中?

4

1 回答 1

0

在 Backbone >= 1.x 上,您可以简单地分配Backbone.$而不是使用Backbone.setDomLibrary.

Backbone < 0.9.9 的解决方案

您需要解决的第一个问题是无论如何您如何在 Node 上运行它。Nodejs 是一个服务器端的 JS 环境,但它不包含任何控制 DOM 的逻辑。为此,您需要加载类似 JSDo 的内容。

当您设置了一些 DOM 环境时,您可以将 jQuery 和您的代码加载到其中,它应该像浏览器一样工作。

不过,要具体回答您的问题,将 jQuery 加载到 jQueryglobal中有点丑陋。您应该使用 Backbone 的setDomLibrary功能将 $ 设置为您想要的。

尝试这样的事情:

if (typeof exports !== 'undefined') {
    MyModels = exports;
    Backbone.setDomLibrary(require('jquery'));
    server = true;
} else {
    MyModels = this.MyModels = {};
}

但是,如果您尝试执行任何 DOM 功能,这将失败。

于 2012-10-09T03:14:52.517 回答