来自RequireJS模块的BreezeJS中的模型扩展

时间:2014-01-10 20:06:27

标签: requirejs breeze

我经常使用以下语法在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);

虽然这对我来说也很笨拙。思考?

2 个答案:

答案 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)
});