覆盖一个微风实体值getter setter似乎打破了变化跟踪

时间:2014-03-07 16:39:22

标签: javascript entity-framework angularjs breeze

我正在使用breeze与Web.API 2.1进行通信 在我的后端,我将一些值保存为字符串列表(而不是保存一对多关系)。在前端,我想打破这些值,编辑它们,将它们重新组合在一起并将它们保存到数据库中。

emailsS​​tring是持久保存到数据库并存在于模型中的实际属性。 fullName充当读取和修改名字和姓氏属性的“接口”。

我有以下内容:

function registerUserProfile(metadataStore) {
            metadataStore.registerEntityTypeCtor('UserProfile', profile, profileInitializer);


        function profile() {
            this.fullName = '';
            this.emails = [];

        }

        function profileInitializer(newItem) {
            if (!newItem.emailsString || newItem.emailsString.length === 0) newItem.emails = [{ email: '' }];
        }

        Object.defineProperty(profile.prototype, 'fullName', {
            get: function() {
                var fn = this.firstName;
                var ln = this.lastName;
                return ln ? fn + ' ' + ln : fn;

            },
            set: function (value) {
                var parts = value.split(' ');
                this.firstName = parts.shift();
                this.lastName = parts.shift() || '';
            }
        });

        Object.defineProperty(profile.prototype, 'emailsString', {
            get: function () {
                return objectToStringArray(this.emails, 'email');
            },
            set: function (value) {
                this.emails = stringToObjArray(value, 'email');
            }
        });


        function objectToStringArray(objectArray, objectValueKey) {
            var retVal = '';
            angular.forEach(objectArray, function (obj) {
                retVal += obj[objectValueKey] + ';';
            });
            if (retVal.length > 0)
                retVal = retVal.substring(0, retVal.length - 1); //remove last ;
            return retVal;
        }

        function stringToObjArray(stringArray, objectValueKey) {
            var objArray = [];
            angular.forEach(stringArray.split(';'), function (str) {
                var item = {};
                item[objectValueKey] = str;
                objArray.push(item);
            });
            return objArray;
        }

如果我修改了emailString值并在微风上调用saveChanges就没有任何反应。如果我修改了fullName属性,则会检测到所有更改,并且saveChanges会发送正确的JSON对象以进行保存(包括emailString值)。

根据我的理解,覆盖emailString属性我会以某种方式破坏此属性的更改跟踪。 fullName不是映射属性,因此不会覆盖任何内容,因此它可以正常工作。我会走正确的路吗?如果有,有办法通知微风,覆盖属性已经改变了吗?

1 个答案:

答案 0 :(得分:0)

通常,Breeze接管一个对象上的每个属性,并确保在内部通知每个属性的任何更改。这是如何完成的,取决于您使用的是Angular,Knockout还是Backbone(或自定义的modelLibrary适配器)。

但是如果你打算自己修改属性以做类似的事情,你需要确保微风仍然得到通知。

根据您发布的代码,我假设您使用的是Angular。在这种情况下,您首先需要确定您的代码是在Breeze的代码之前还是之后执行。

我的猜测是,如果您及早做出更改,那么Breeze将能够成功包装它们。但是,如果您的更改发生在Breeze之后,那么您需要确保调用Breeze的代码。调试源代码可能是你最好的选择。 Breeze Angular适配器是一个很好的源代码,作为如何包装可能已经用另一个 defineProperty 包装的属性的示例。

相关问题