undefined不是骨干中的功能

时间:2014-10-26 08:45:00

标签: javascript jquery backbone.js workflow

我正在使用backbone和workflow.js扩展来设置我的应用程序的流程。我有以下骨干模型

var InvoiceModel = Backbone.Model.extend({

    workflow: {
        initial: 'draft',

        events: [
            { name: 'issue', from: 'draft', to: 'issued' },
            { name: 'payout', from: 'issued', to: 'paid' },
            { name: 'cancel', from: 'draft', to: 'canceled' },
            { name: 'cancel', from: 'issued', to: 'canceled' }
        ]
    },

    initialize: function () {
        _.extend(this, new Backbone.Workflow(this, { attrName: 'status' }));
    }

});

我正在使用上面的模型

    var invoiceModel = new InvoiceModel();
    console.log(invoiceModel.get('status'));

    invoiceModel.triggerEvent('issue'); // Uncaught TypeError: undefined is not a function

当我使用triggerEvent()函数时,返回undefined is not a function为什么以及如何解决此错误?

更新

以下是FIDDLE

2 个答案:

答案 0 :(得分:3)

方法triggerEvent()隐藏在Workflow对象的原型中。

_.extend()仅复制对象自己的属性而没有原型中的属性。

您的示例适用于:

initialize: function () {
    _.extend(this, (new Backbone.Workflow(this, {
        attrName: 'status'
    })).__proto__, new Backbone.Workflow(this, {
        attrName: 'status'
    }));
}

如您所见,我明确地向扩展链添加了一个原型。

知道这是一个非常不优雅的解决方案。虽然我还没找到更好的,但我希望它能解释你的问题。


这也有效:

var Workflow = new Backbone.Workflow(this, {
    attrName: 'status'
});
_.extend(this, Workflow);
$.extend(this, Workflow);

这里下划线复制Workflow自己的属性(model),jQuery深层复制原型中的属性。

答案 1 :(得分:0)

triggerEvent不是Backbone.Model方法。您使用trigger发出事件。如果triggerEvent来自您的工作流程库(我在Google快速搜索后无法找到任何链接/信息),那么您可能错误地设置了您的课程。

我不认为您的初始化方法是正确的,但如果没有看到工作流程文档,我无法告诉您更多信息。

但是,增强Backbone组件的一般模式是使用另一个类方法扩展Model定义的原型,而不是扩展您的{{{{>>实例(this中的类1}}方法),带有 new 实例。

我非常确定错误所在的位置。 ;)