versiones framework apps app angularjs internet-explorer-8 breeze defineproperty

angularjs - framework - version angular



La aplicaciĆ³n Breeze and Angular ''ToDo'' no funciona con IE 8 (3)

Breeze usa ViewModel del marco MVVM de alojamiento. Esa es generalmente una buena decisión. Además, el seguimiento de cambios en las entidades es un concepto fundamental de breeze.js (igual para Entity Framework). Es una tarea fácil realizar un seguimiento de los cambios si el marco MVVM usa Observables con captador y definidores reales (por ejemplo, Knockout). AngularJS por otro lado funciona con objetos JavaScript simples. Esto hace que cambie la dificultad de seguimiento. Las dos únicas formas confiables son las propiedades ES5 (simples, pero no soportadas por IE8) o una integración muy profunda en el ciclo $ digest. El equipo de brisa tomó la primera opción, ¡qué lástima para los proyectos que tienen que soportar IE8!

Bien, analicemos la causa raíz del problema: cambiar el seguimiento

¿Realmente necesitas esa característica? Al menos en nuestro proyecto decidimos por breeze.js / OData para leer y por un enfoque más "tranquilo" cuando se trata de escribir. Si no necesita esas características avanzadas, la siguiente secuencia de comandos debería resolver el problema:

/******************************************************** * 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));

Descargue en: https://gist.github.com/JohannesHoppe/72d7916aeb08897bd256

Esta es una versión simple del backingStore original, sin CUALQUIER seguimiento de cambios - ¡por eso funcionará en IE8! (Object.defineProperty ya no es necesario) Este adaptador es un reemplazo para el adaptador "backingStore" en el núcleo de Breeze. Tiene el mismo nombre de adaptador, por lo que reemplazará silenciosamente el adaptador "backingStore" original cuando cargue el script DESPUÉS de la biblioteca de brisa.

Aquí hay una demostración para probar la funcionalidad:
http://jsfiddle.net/Johannes_Hoppe/bcav9hzL/5/

JsFiddle no es compatible con IE8, utilice este enlace directo:
http://jsfiddle.net/Johannes_Hoppe/bcav9hzL/5/embedded/result/

¡Aclamaciones!

He descargado las aplicaciones de muestra ''Breeze 0.83.5'' de http://www.breezejs.com/documentation/download

La muestra Angular ''ToDo'' no funciona con IE8.

He incluido las siguientes referencias de script sobre mi referencia de script de Breeze.

¿Alguna idea de por qué esto no funciona?


El soporte angular de Breeze utiliza el ''backingStoreAdapter'', que a su vez depende del método ES5 Javascript ''defineProperty'' implementado por el navegador. Esto no se implementó en IE8, y lamentablemente, no se puede complementar mediante el uso de una cuña.

Este es el único adaptador que tiene esta limitación, los adaptadores de red troncal y adaptadores de red troncal, ambos funcionan con IE8 con el uso de cuñas ES5.

¡Lo siento!


No funcionará en IE8 en las versiones futuras de Breeze tampoco.

Todo-Angular se ejecuta en navegadores modernos como IE9, IE10 y navegadores recientes de Chrome, Safari, Firefox y WebKit. Breeze no es compatible con las aplicaciones AngularJS que se ejecutan en navegadores antiguos que carecen de captadores y definidores de propiedades ECMAScript 5.