Приложение Breeze и Angular «ToDo» не работает с IE 8

I have downloaded the sample 'Breeze 0.83.5' applications from http://www.breezejs.com/documentation/download

Угловой образец «ToDo» не работает с IE8.

Я включил следующие ссылки сценариев выше ссылки на сценарий Breeze.

Любая идея, почему это не работает?

6
nl ja de

3 ответы

Угловая поддержка Breeze использует «backingStoreAdapter», который, в свою очередь, зависит от метода ESV Javascript «defineProperty», реализуемого браузером. Это не было реализовано в IE8 и, к сожалению, не может быть дополнено с помощью прокладки.

Это единственный адаптер, который имеет это ограничение, ножевые носовые и базовые адаптеры, оба работают с IE8 с использованием прокладок ES5.

Сожалею!

3
добавлено
Эй, Джей ... Удивительная работа с Бризом! Какая чудесная «часть» программного обеспечения. Поздравляем за то, что он доступен для всех США. Что касается поддержки IE 8: похоже, что исправление было объединено здесь: github.com/es -shims/es5-shim/issues/5 С помощью этого исправления вы считаете целесообразным использовать Angular & Breeze вместе в IE 8?
добавлено автор Leniel Macaferi, источник
@Ward: Отлично! Будем надеяться, что исправление действительно добавит необходимую поддержку.
добавлено автор Leniel Macaferi, источник
Мы посмотрели на него, но не совсем уверены, как реализовать внутренние уведомления об изменениях на ветру, которые нам нужны без «defineProperty». Угловая функция часов появляется слишком поздно, чтобы мы могли ее использовать (я думаю). Но ... пожалуйста, добавьте этот пункт в голос пользователя на ветру (и проголосуйте за него). Также взгляните на поддержку бризового хранилища, и если вы можете придумать другой подход к ее реализации, сообщите мне. Это сложно, я знаю, потому что Angular действительно отлично работает с бризом на современных браузерах.
добавлено автор Jay Traband, источник
Мы будем следить за вашим предложением, @LenielMacaferi. Кажется слишком хорошим, чтобы быть правдой. Мы узнаем.
добавлено автор Ward, источник
Обратите внимание здесь. Я уточню это место, когда у меня будет окончательный ответ. FWIW, не выглядит хорошо на данный момент . Все еще нужно подтвердить, но ссылка на сообщение в блоге на прокладке кажется неправильной в отношении IE8 . __ defineGetter __ (например, defineProperty ) работает только для свойств элемента DOM в IE8, а не для свойств JS obj. Это бесполезно. Вы не хотите, чтобы Бриз использовал IE8 DOM для отслеживания изменений! У меня есть еще одна вещь, чтобы попробовать. Если это не сработает (LIKELY), мы вернемся к нулю. Да ... мы разочарованы. Я сказал, что это звучит слишком хорошо, чтобы быть правдой ... и так кажется.
добавлено автор Ward, источник
Привет, Джей, любая идея, если она будет исправлена ​​в будущих версиях? Нам нужно поддерживать IE8, а угловой сам по себе не имеет проблем с IE8. Спасибо.
добавлено автор nihique, источник
@Ward: Есть ли место, где мы можем отслеживать ваше расследование, или вы обновите этот вопрос, если ваше расследование окажется плодотворным?
добавлено автор ProxyTech, источник

Он не будет работать в IE8 в будущих версиях Breeze .

Todo-Angular работает в современных браузерах, таких как IE9, IE10 и последние   Браузерами Chrome, Safari, Firefox и WebKit. Бриз не поддерживает   Приложения AngularJS работают в старых браузерах, которым не хватает ECMAScript 5   имущественные геттеры и сеттеры.

1
добавлено
Извините за двусмысленность. Я имею в виду, что он не будет работать на IE8 даже в будущих версиях Breeze из-за того, что defineProperty не может быть подстроен в IE8, как вы уже сказали. Я обновляю свой ответ соответственно.
добавлено автор Umur Kontacı, источник
Не уверен, что вы имеете в виду, чтобы не работать над будущими версиями. Мы тестируем прямо сейчас на последних версиях Firefox, Chrome и IE. Адаптер backingStore работает отлично на всех трех. Есть ли у вас случай, когда это не так?
добавлено автор Jay Traband, источник
Согласовано, и thx
добавлено автор Jay Traband, источник

Breeze использует ViewModel хостинг-инфраструктуры MVVM. Это, как правило, хорошее решение. Кроме того, отслеживание изменений для сущностей является фундаментальной концепцией breeze.js (то же самое для Entity Framework). Легкая задача отслеживать изменения, если среда MVVM использует Observables с реальными getter и seters (например, Knockout). AngularJS с другой стороны работает с обычными объектами JavaScript. Это затрудняет отслеживание изменений. Единственными двумя надежными способами являются ES5-свойства (простые, но не поддерживаемые IE8) или очень глубокая интеграция в цикле $ digest. Команда бриза взяла первый выбор - как жаль проектов, которые должны поддерживать IE8!

Ok, let's analyze the root cause of the problem: change tracking

Вам действительно нужна эта функция? По крайней мере, в нашем проекте мы решили использовать breeze.js/OData для чтения и для более «спокойного» подхода, когда дело доходит до написания. Если вам не нужны эти дополнительные функции, следующий сценарий должен решить проблему:

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

Download at: https://gist.github.com/JohannesHoppe/72d7916aeb08897bd256

Это голая версия оригинальной базы backingStore, без каких-либо изменений отслеживания - вот почему она будет работать в IE8! (Object.defineProperty больше не требуется) Этот адаптер является «заменой» для замены адаптера «backingStore» в ядре Breeze. Он имеет одно и то же имя адаптера, поэтому он будет молча заменить оригинальный адаптер backingStore, когда вы загружаете скрипт ПОСЛЕ БИСТОВОЙ библиотеки.

Here is a demo to proof the functionality:
http://jsfiddle.net/Johannes_Hoppe/bcav9hzL/5/

JsFiddle does not support IE8, please use this direct link:
http://jsfiddle.net/Johannes_Hoppe/bcav9hzL/5/embedded/result/

Ура!

0
добавлено
Angular — русскоговорящее сообщество
Angular — русскоговорящее сообщество
3 960 участник(ов)

Общаемся на темы Angular 4+, его экосистемы, TypeScript, NativeScript и т.д. По вопросам SSR, Angular Universal @angular_universal_ru См. также: @typescript_ru, @react_js, @nodejs_ru, @js_ru Вакансии и поиск работы: @javascript_jobs

Angular.js (1.x) — русскоговорящее сообщество
Angular.js (1.x) — русскоговорящее сообщество
704 участник(ов)

Общаемся и обсуждаем темы, посвященные Angular 1.x и экосистеме.

AngularJS, Javascript
AngularJS, Javascript
370 участник(ов)

Angularjs russian chat