我正在使用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
答案 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 实例。
我非常确定错误所在的位置。 ;)