breeze 1.4.11和IE8的错误

breeze 1.4.11和IE8的错误,breeze,Breeze,尝试使用breeze 1.4.11和IE8下载数据会引发以下异常: 无法分析或导入元数据:无法在此javascript引擎上定义getter和setter 该错误是由b00_breeze.modelbrary.backingStore.js的第173行引起的 创建了一个用于复制错误的库。IE8中明确不支持Breeze“backingStore”模型库。这是因为“backingStore”实现需要完整的javascript“Object.defineProperty”功能,这在IE8中不可用,任何

尝试使用breeze 1.4.11和IE8下载数据会引发以下异常:

无法分析或导入元数据:无法在此javascript引擎上定义getter和setter

该错误是由b00_breeze.modelbrary.backingStore.js的第173行引起的


创建了一个用于复制错误的库。

IE8中明确不支持Breeze“backingStore”模型库。这是因为“backingStore”实现需要完整的javascript“Object.defineProperty”功能,这在IE8中不可用,任何shim都无法提供

也就是说,breeze的“淘汰”和“主干”模型库适配器都应该与IE8配合使用


另请参见:

Breeze使用托管MVVM框架的ViewModel。这通常是个好决定。此外,对实体的更改跟踪是breeze.js的一个基本概念(对于实体框架也是如此)。如果MVVM框架使用带有真正的getter和setter(例如Knockout)的observates,那么跟踪更改是一项很容易的任务。另一方面,AngularJS处理普通JavaScript对象。这使得更改跟踪变得困难。唯一可靠的方法是ES5属性(简单,但不受IE8支持)或$digest循环中的深度集成。breeze团队选择了第一个选择——对于那些必须支持IE8的项目来说,这是多么遗憾啊

好的,让我们分析问题的根本原因:更改跟踪

你真的需要这个功能吗?至少在我们的项目中,我们决定使用breeze.js/OData进行阅读,并在写作时使用更“restful”的方法。如果您不需要这些高级功能,那么以下脚本应该可以解决此问题:

/********************************************************
 * A replacement for the "backingStore" modelLibrary
 * 
 * This is a bare version of the original backingStore,
 * without ANY change tracking - that's why it will work in IE8!
 * (Object.defineProperty not required any more)
 *
 * This adapter is a "drop in" replacement for the "backingStore" adapter in Breeze core.
 * It has the same adapter name so it will silently replace the original "backingStore" adapter
 * when you load this script AFTER the breeze library.
 * WARNING: For obvious reasons a lot of breeze magic will be lost!
 *
 * Author: Johannes Hoppe / haushoppe-its.de
 *
 * Copyright 2014 IdeaBlade, Inc.  All Rights Reserved.  
 * Use, reproduction, distribution, and modification of this code is subject to the terms and 
 * conditions of the IdeaBlade Breeze license, available at http://www.breezejs.com/license
 ******************************************************/

(function (definition, window) {
    if (window.breeze) {
        definition(window.breeze);
    } else if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
        // CommonJS or Node
        var b = require('breeze');
        definition(b);
    } else if (typeof define === "function" && define["amd"] && !window.breeze) {
        // Requirejs / AMD 
        define(['breeze'], definition);
    } else {
        throw new Error("Can't find breeze");
    }
}(function (breeze) {
    "use strict";

    var core = breeze.core;

    var ctor = function () {
        this.name = "backingStore";
        this.A_BIG_FAT_WARNING = "This is a bare version of the backingStore! Change tracking won't work!";
    };

    var protoFn = ctor.prototype;

    protoFn.initialize = function() {

    };

    protoFn.getTrackablePropertyNames = function (entity) {
        var names = [];
        for (var p in entity) {
            if (p === "entityType") continue;
            if (p === "_$typeName") continue;

            var val = entity[p];
            if (!core.isFunction(val)) {
                names.push(p);
            }
        }
        return names;
    };

    protoFn.initializeEntityPrototype = function (proto) {

        proto.getProperty = function (propertyName) {
            return this[propertyName];
        };

        proto.setProperty = function (propertyName, value) {
            this[propertyName] = value;
            return this;
        };
    };

    // This method is called when an EntityAspect is first created - this will occur as part of the entityType.createEntity call.
    // which can be called either directly or via standard query materialization
    // entity is either an entity or a complexObject
    protoFn.startTracking = function (entity, proto) {

        // assign default values to the entity
        var stype = entity.entityType || entity.complexType;
        stype.getProperties().forEach(function (prop) {

            var propName = prop.name;
            var val = entity[propName];

            if (prop.isDataProperty) {
                if (prop.isComplexProperty) {
                    if (prop.isScalar) {
                        val = prop.dataType._createInstanceCore(entity, prop);
                    } else {
                        val = breeze.makeComplexArray([], entity, prop);
                    }
                } else if (!prop.isScalar) {
                    val = breeze.makePrimitiveArray([], entity, prop);
                } else if (val === undefined) {
                    val = prop.defaultValue;
                }

            } else if (prop.isNavigationProperty) {
                if (val !== undefined) {
                    throw new Error("Cannot assign a navigation property in an entity ctor.: " + prop.Name);
                }
                if (prop.isScalar) {
                    // TODO: change this to nullstob later.
                    val = null;
                } else {
                    val = breeze.makeRelationArray([], entity, prop);
                }
            } else {
                throw new Error("unknown property: " + propName);
            }
            entity[propName] = val;
        });
    };

    breeze.config.registerAdapter("modelLibrary", ctor);
}, this));
下载地址:

这是原始backingStore的裸版,没有任何更改跟踪-这就是它在IE8中工作的原因!(Object.defineProperty不再需要)此适配器是Breeze core中“backingStore”适配器的“插入式”替代品。它具有相同的适配器名称,因此当您在breeze库之后加载脚本时,它将以静默方式替换原始的“backingStore”适配器

下面是一个演示来验证该功能:

JSFIDLE不支持IE8,请使用此直接链接:


干杯

对不起,我没注意到那个部分。谢谢