我经常使用以下语法在BreezeJS中扩展我的实体:
var Employee = function () {
this.FirstName = ko.observable(""); // default FirstName
this.LastName = ko.observable(""); // default LastName
this.fullName = ko.computed(
function () {
return this.FirstName() + " " + this.LastName();
}, this);
};
manager.metadataStore.registerEntityTypeCtor("Employee", Employee);
当我内联(在同一个脚本中)时,它按预期工作。当我将Employee定义移动到它自己的Require.JS模块时,原型从
更改{}
到
{ __moduleId__ : 'Employee' }
BreezeJS对此嗤之以鼻,并给出了一个:
TypeError: cannot call "bind" of undefined.
我通过在构造函数注册之前指定Employee.prototype = {}来创建一个bandaid修复,但我觉得这不是最好的方法。
是否可以覆盖Require.JS对模块原型的修改,或者是否可以使Breeze.JS能够很好地利用这些额外的代码?
或者,我考虑过嵌套我的物体,所以我会做类似的事情:
manager.metadataStore.registerEntityTypeCtor("Employee", Employee.modelCtor);
虽然这对我来说也很笨拙。思考?
答案 0 :(得分:1)
您可以在初始化时扩展您的实体。而不是使用构造函数,使用初始化程序 -
manager.metadataStore.registerEntityTypeCtor("Employee", Employee.modelCtor, empInitializer);
function empInitializer(employee) {
employee.fullName = ko.computed(function () {
var ln = employee.lastName();
var fn = employee.firstName();
return fn + ' ' + ln;
});
}
答案 1 :(得分:1)
我和一个非常相似的例子有完全相同的症状,最后通过删除绊倒Breeze的__moduleId__
属性来修复它。如下:
// workspace.js
define(['durandal/system', 'ko'], function (system, ko) {
return function() {
this.myBreezeEntityProperty = ko.observableArray();
// Delete the __moduleId__ property so breeze works
delete this.constructor.prototype.__moduleId__;
};
});
// domain.js
define(['./workspace', ...], function(Workspace, ...) {
breezemetadatastore.registerEntityTypeCtor("Workspace", Workspace)
});