扩展 Backbone.Collection 原型

2024-04-10

继从这个问题 https://stackoverflow.com/questions/10219182/retrieve-element-from-backbone-collection-removen,我正在尝试使用一些自定义方法来增强 Backbone.Collection。但是,我在控制台和源之间发现了一些不一致的行为。

这是测试的样子

HTML

... 
<script type="text/javascript" src="./libs/underscore.js"></script>
<script type="text/javascript" src="./libs/backbone.js"></script>
<script type="text/javascript" src="./libs/backbone-extend.js"></script>    
<script type="text/javascript" src="./qunit/qunit.js"></script>
<script type="text/javascript" src="./backbone-extend-tests.js"></script>
</body></html>

骨干扩展.js

Backbone.Collection.prototype.extract = function() {
    // placeholder to test binding
    return 'foo';
};

骨干扩展测试.js

test('extending backbone', function () {
    ok(typeof Backbone.Collection.extract == 'function');
    console.log(Backbone.Collection.extract); // undefined
});

我有什么遗漏的吗?我检查过所有源都正在加载

JFTR - 这...

_.extend(Backbone.Collection, {extract:function(){return'foo';});

...有效,只是不使用原型增强方法。我只是不确定为什么一种方法有效而另一种方法无效,因为 Backbone 的文档推荐 http://documentcloud.github.com/backbone/#FAQ-extending原型增强(尽管它特别提到了模型)。我想我需要更详细地看看引擎盖下面......

UPDATE:为了后代,将其放在backbone-extend.js 文件中...

 _.extend(Backbone.Collection.prototype, {
     extract : function (model) {
     var _model = model;
     this.remove(model);
     return _model;
 }
 });

... 有效


您混淆了一些关键概念,这就是为什么您没有看到您期望的行为,这更多是一个基本的 javascript 问题,与主干不完全相关。

考虑以下构造函数:

var Klass = function() {};

您可以使用以下方式调用该构造函数new关键字从该构造函数获取实例。

var klassInstance = new Klass();

现在,假设我想添加一个可用于all从该构造函数派生的实例的数量。为此我可以使用prototype object.

Klass.prototype.instanceMethod = function() { alert('hi'); };

然后我应该能够使用以下命令调用该方法:

klassInstance.instanceMethod();

不过,我还可以添加一个static函数(我在这种情况下宽松地使用这个术语)到构造函数本身,可以在没有实例的情况下调用它。

Klass.staticMethod = function() { alert('yo!'); };

该方法将直接从构造函数中可用,但将not直接从实例中可用。

例如:

klassInstance.staticMethod == undefined

所以你的测试真正的错误在于你向prototype– 一个可用于该“类”的所有实例的方法 – 但在您的测试中,您直接在“类”本身上测试方法。这不是同一件事。


顺便说一句,虽然相关,但 Backbone.js 提供了一个内置机制来创建内置类型的“子类”。这是static .extend()方法。这为您提供了一种简单的方法来将您自己的功能添加到基本 Backbone 类中。

在你的情况下,你会想做类似的事情:

var MyCollection = Backbone.Collection.extend({
    extract: function() {
        // do whatever
    }
}) 

然后,您可以创建新类的实例,该实例将具有.extract()方法对他们说:

var coll = new MyCollection();
coll.extract();

TL;DR;

最终 - 回到你原来的问题 - 如果你想要一个可用于特定类的所有实例的方法,那么你的test是不正确的。您需要新建一个实例来测试:

test('extending backbone', function () {
    var col = new Backbone.Collection();
    ok(typeof col.extract == 'function');
});

或者检查prototype直接用于方法——这有细微的不同,因为prototype对象不是only为一个对象获取一个方法。

test('extending backbone', function () {
    ok(typeof Backbone.Collection.prototype.extract == 'function');
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展 Backbone.Collection 原型 的相关文章

随机推荐

  • 如何从容器内部获取 YARN ContainerId?

    我正在 YARN 上运行 Spark 作业 并且希望获取 YARN 容器 ID 作为在一组 Spark 作业中生成唯一 ID 的要求的一部分 我可以看到容器 getId https hadoop apache org docs r2 6 0
  • windows下docker的vm.max_map_count问题

    我正在尝试在我的 windows10 上运行 ELK docker 镜像 如下所示 C WINDOWS system32 gt docker run p 5601 5601 p 9200 9200 p 9300 9300 p 5044 50
  • 插入带有扭曲问题的选择

    我想将一个表 当然具有某个ID 的所有数据复制到同一个表中 但略有不同 我有这个表 产品数量 id groupId productId quantity 1 2 2 5 我想要做的是复制 groupId 2 的所有数据 将其插入到 grou
  • Xcode 4 中的静态库

    我太喜欢 Xcode 4 X 中的静态库了 以下是我通常做的步骤 1 为了制作静态库 我打开Xcode new 静态库 然后在项目中添加一些类 然后构建阶段 gt 复制标头 gt 在这里一一添加所有标头 然后我构建该项目 当在 ios 模拟
  • YOLO 目标检测:算法如何预测大于网格单元的边界框?

    我试图更好地理解 YOLO2 和 3 算法的工作原理 该算法处理一系列卷积 直到达到13x13网格 然后它能够 对每个网格单元内的对象以及这些对象的边界框进行分类 如果您查看这张图片 您会发现红色边框比任何单个网格单元都大 边界框也以对象的
  • Python 3 和 NLTK 与 WordNet 2.1 - 这可能吗?

    我将 Python 3 和 NLTK 3 0 0 与 WordNet 3 0 结合使用 我想用该数据 semval2007 https github com alvations pywsd tree master pywsd data se
  • 为什么在这段代码中,await 不会阻塞 flutter 中的 ui

    在默认示例应用程序中 每当您创建新的 flutter 项目时 我都添加了以下代码 initState super initState loop loop async while true await Future delayed Durat
  • C# 中的数组列表

    我们可以将 ArrayList 作为参数传递给 C 中的方法吗 绝对地 然而 你很少应该这样做 这些天你应该差不多always使用泛型类型 例如List
  • 动态 SQL 查询根据单元格中的空值忽略空值

    我有一个动态 SQL 查询 在运行时具有不同的列名和表 我希望让 SQL 查询根据行是否在任何单元格中包含 Null 值来忽略读取数据 SELECT rsv intension rsvt FROM resolve table kb wher
  • 使用复杂风味树更改 google-services.json 的搜索位置

    我知道已经有人问过这个问题 但是对于 4 2 0 以上的 com google gms google services 的任何版本 问题仍然存在 我的 google services json 文件的搜索位置不再考虑风味树状结构 它只写着
  • 使用 Angular JS 时如何加载 AMD 模块?

    由于某种奇怪的原因Angular JS 有自己的模块系统 既不是 AMD 也不是 CommonJS http docs angularjs org guide module 我有许多 AMD 格式的现有模块 我想在 Angular 应用程序
  • ADL 是否适用于全局命名空间?

    Examples https stackoverflow com a 5076640 321013 such as https groups google com forum original comp lang c moderated 1
  • 多个 Android 应用程序依赖于带有 gradle 的 android 库

    我仍在学习 gradle 但根据我所读到的内容 我想知道这是否可能 我有多个 Android 应用程序 app1 app2 app3 它们依赖于 android 库 L android 库 L 将依赖于 volley 等外部库 而应用程序将
  • 如何在android中的NumberPicker中自定义数字的值?

    我有一个数字选择器 用于设置以 MB 为单位的数据限制 现在 我有 numberPicker 包含按顺序排列的数值 如 1 2 3 2000 MB 但我想要一个应包含 100 200 300 2000MB 等数值的 numberPicker
  • PostgreSQL psycopg2 返回字符串元组而不是元组元组?

    我有一个奇怪的问题 在搜索 Google SO 没有发现类似的情况后 我不太确定如何解决它 当我尝试从光标获取查询结果时 它给了我一个元组的元组 除了元组是字符串 下面是代码 def queryFeeds db sql SELECT ngo
  • 如何在作业开始前清理 Jenkins 管道中的工作区

    我需要在构建开始之前清理工作区 我尝试使用cleanDir 分阶段进行 但在声明性管道中 检查首先发生 并且当阶段与cleadDir运行时 签出的代码也会被清除 这是不希望的 在声明式管道中签出之前 我们如何清除工作区 实际上 我必须根据管
  • 如何将本地 django 制作的站点移动到另一台机器上?

    我努力寻找我的查询的解决方案 但没有成功 我在本地机器上使用 django 制作了一个网站 现在我想在另一台机器上安装相同的 django 制作的网站 MySQL是我正在使用的数据库 如何将本地 django 制作的网站移动到另一台机器上
  • PHP - Postgresql 如果返回错误,如何回滚查询?

    我正在使用 php 和 postgres 进行 CRUD 我想知道如果出现错误是否有办法回滚事务 实际上 如果我在事务中遇到错误 id 主键 就会增加 然后我会丢失一个 id 以供将来使用 我该如何预防 我的意思是 如果插入查询失败 不要在
  • 套接字无法连接到端点

    var socket new Socket localhost 4000 socket connect Returns WebSocket connection to ws localhost 4000 ws failed Error du
  • 扩展 Backbone.Collection 原型

    继从这个问题 https stackoverflow com questions 10219182 retrieve element from backbone collection removen 我正在尝试使用一些自定义方法来增强 Ba