Backbone.js 视图是不是需要 jQuery 或 Zepto? (或者:为啥我会收到“未捕获的类型错误:未定义不是函数”?)

Posted

技术标签:

【中文标题】Backbone.js 视图是不是需要 jQuery 或 Zepto? (或者:为啥我会收到“未捕获的类型错误:未定义不是函数”?)【英文标题】:Do Backbone.js views require jQuery or Zepto? (Or: why am I getting “Uncaught TypeError: undefined is not a function”?)Backbone.js 视图是否需要 jQuery 或 Zepto? (或者:为什么我会收到“未捕获的类型错误:未定义不是函数”?) 【发布时间】:2011-10-07 03:03:14 【问题描述】:

我刚刚开始使用 Backbone.js。我对Backbone.ModelBackbone.View 进行了子类化:

var Message = Backbone.Model.extend();

var MessageView = Backbone.View.extend(
    tagName: 'div',
    className: 'message',
    template: _.template(' html '),

    render: function()
        this.template(
            html: this.model.html
        );
        this.el.className.append(' ' + this.model.type);

        return this;
    
);

然后我尝试为每个创建一个实例:

var message = new Message(html: html, type: type);
var messageView = new MessageView(model: message);

最后一行导致错误(在 Chrome 12 中):Uncaught TypeError: undefined is not a function。它将这个错误追溯到 Backbone.js 中的函数f.extend.make

Backbone.js documentation on view.make 说:

用于创建具有可选属性和 HTML 内容的给定类型 (tagName) 的 DOM 元素的便捷函数。在内部用于创建初始 view.el

    是否需要 jQuery 或 Zepto? 我能否通过在对Backbone.View.extend 的调用中覆盖view.make 来消除这种依赖关系?

【问题讨论】:

【参考方案1】:

1) 文档说明它需要

jQuery (> 1.4.2) 或 Zepto。

2) 视图组件与 jQuery/Zepto API 紧密耦合。您可以重新实现它,但如果您广泛使用backbone.js,您将重新实现整个界面。

但也许它适用于您的小用例,但由于紧密耦合,我不能保证它有效。

【讨论】:

re 1) — 哦,是的!就在上面,抱歉。【参考方案2】:

您也可以使用Spine.js 代替主干。

它也与 JQuery 和 Zepto 兼容,但不需要模板。

Spine.js 也不需要下划线,但您可以根据需要添加为插件。

了解更多关于一个好的review here。

Spine.js 使用控制器概念将数据模型与元素绑定。

【讨论】:

以上是关于Backbone.js 视图是不是需要 jQuery 或 Zepto? (或者:为啥我会收到“未捕获的类型错误:未定义不是函数”?)的主要内容,如果未能解决你的问题,请参考以下文章

将集合绑定到 Backbone.js 中的视图

Backbone.js 单个集合项视图

如何正确渲染 Backbone.js 视图

Backbone.js:清除所有视图的最佳方法

如何在 Backbone.js 中设置视图的 id?

Backbone.js:在视图之间导航 - 销毁和重新创建