【问题标题】:Creating a backbone plugin创建主干插件
【发布时间】:2012-08-14 03:14:37
【问题描述】:

试图创建一个从Backbone.Model“继承”但覆盖sync方法的主干“插件”。

这是我目前所拥有的:

Backbone.New_Plugin = {};
Backbone.New_Plugin.Model = Object.create(Backbone.Model);
Backbone.New_Plugin.Model.sync = function(method, model, options){
    alert('Body of sync method');
}

方法:Object.create()直接取自Javascript: The Good Parts一书:

Object.create = function(o){
    var F = function(){};
    F.prototype = o;
    return new F();
};

我在尝试使用新模型时遇到错误:

var NewModel = Backbone.New_Plugin.Model.extend({});
// Error occurs inside backbone when this line is executed attempting to create a
//   'Model' instance using the new plugin:
var newModelInstance = new NewModel({_pk: 'primary_key'}); 

错误出现在Backbone 0.9.2开发版的1392行。函数内部inherits():

Uncaught TypeError: Function.prototype.toString is not generic 。

我正在尝试以主干库Marionette 创建新版本视图的方式创建一个新插件。看来我误解了应该这样做的方式。

为骨干创建新插件的好方法是什么?

【问题讨论】:

    标签: backbone.js javascript javascript-framework marionette


    【解决方案1】:

    您扩展Backbone.Model 的方式不是您想要的方式。如果你想创建一种新的模型,只需使用extend

    Backbone.New_Plugin.Model = Backbone.Model.extend({
        sync: function(method, model, options){
            alert('Body of sync method');
        }
    });
    
    var newModel = Backbone.New_Plugin.Model.extend({
        // custom properties here
    });
    
    var newModelInstance = new newModel({_pk: 'primary_key'});
    

    另一方面,Crockford 的 Object.create polyfill 被认为已过时,因为(我相信)Object.create 的最新实现需要多个参数。此外,您使用的特定函数不会遵循原生 Object.create 函数,如果它存在的话,您可能只是省略了应该包装该函数的 if (typeof Object.create !== 'function') 语句。

    【讨论】:

    • 啊,太好了,非常感谢!是的,我确实省略了 Object.create 函数包装器,因为我想将帖子中的代码减少到最低限度。我使用的版本确实有包装器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多