2016-03-07 4 views
0

Я обновляю свое приложение с .NET 4.0 до 4.5 и обновляю Breeze.js с 1.4.17 до 1.5.4. Кажется, что все хорошо работает в IE11 и других браузерах, но в IE8 (или в IE11 в режиме IE8) я получаю ошибку «Объект не поддерживает это свойство или метод», связанную с методом _normalizeServiceName в этом разделе кода:Объект не поддерживает это свойство или метод в IE8: _normalizeServiceName

function updateWithConfig(obj, config) { 
    if (config) { 
    assertConfig(config) 
     .whereParam("serviceName").isOptional() 
     .whereParam("adapterName").isString().isOptional() 
     .whereParam("uriBuilderName").isString().isOptional() 
     .whereParam("hasServerMetadata").isBoolean().isOptional() 
     .whereParam("jsonResultsAdapter").isInstanceOf(JsonResultsAdapter).isOptional() 
     .whereParam("useJsonp").isBoolean().isOptional() 
     .applyAll(obj); 
    obj.serviceName = obj.serviceName && DataService._normalizeServiceName(obj.serviceName); // <<< Error here 
    obj.adapterInstance = obj.adapterName && __config.getAdapterInstance("dataService", obj.adapterName); 
    obj.uriBuilder = obj.uriBuilderName && __config.getAdapterInstance("uriBuilder", obj.uriBuilderName); 
    } 
    return obj; 
} 

Я могу видеть, что метод _normalizeServiceName определяется сразу после updateWithConfig:

ctor._normalizeServiceName = function (serviceName) { 
    serviceName = serviceName.trim(); 
    if (serviceName.substr(-1) !== "/") { 
    return serviceName + '/'; 
    } else { 
    return serviceName; 
    } 
}; 

Если я проследить через где DataService определяется, ctor действительно есть метод _normalizeServiceName определен, когда он возвращается, но время updateWithConfig так как он отсутствует у DataService.

Ошибка возникает, когда я создаю новый EntityManager:

сайт
this.manager = new breeze.EntityManager(appRoot + "breeze/myapp"); 

Бриз кажется, что IE8 по-прежнему поддерживается. У меня есть ES5 Shim/Шэма сценарии, на которые ссылается в условном комментарий:

<!--[if lt IE 9]> 
<script src="/myapp/js/respond.js"></script> 
<script src="/myapp/js/es5-shim.js"></script> 
<script src="/myapp/js/es5-sham.js"></script> 
<script src="/myapp/js/json3.js"></script> 
<![endif]--> 

Итак, IE8 по-прежнему поддерживается в Breeze? Я пропустил что-то, что мне нужно обновить в своем коде при переходе с Breeze 1.4.x на 1.5.x (единственное, что я изменил, было связано с API Promise, который, похоже, изменился)? Или это ошибка в Бризе?

ответ

0

Возможно, это не ответ на вопрос «поддерживает Breeze поддержку IE8», но я думал, что буду документировать то, что я сделал, чтобы снова запустить что-то, на случай, если это поможет кому-то еще.

Первая проблема заключалась в том, что IE8 не любит функции-конструкторы named (если это даже правильная терминология), введенные в this commit to breeze.js. Чтобы обойти это, я добавил заменить шаг к моему gulpfile.js удалить имена функций:

gulp.task("breeze", function() { 
    var js = gulp 
     .src(src.bower + "breeze-client/build/breeze.debug.js") 
     .pipe(replace(/var ctor = function (\w+)/g, "var ctor = function ")) 
     .pipe(rename("breeze.js")) 
     .pipe(gulp.dest(dest.js)); 
    return merge(js); 
}); 

Кроме того, поскольку я использую машинопись, текущие типизации для Breeze определяют IPromise интерфейс (изменен с Q.Promise в this commit, предположительно для поддержки Angular), который использует имена методов, которые IE8 не нравится (catch, наконец), и не определяет ES3-дружественные псевдонимы (fail, fin). Я добавил свои собственные определения, а также определил Q done() метода:

declare module breeze.promises { 
    // IE8 (and other ES3 browsers?) don't like .catch and .finally 
    // Also define Q's .done method. 
    interface IPromise<T> { 
     done<U>(): IPromise<U>; 
     fail<U>(onRejected: (reason: any) => U): IPromise<U>; 
     fail<U>(onRejected: (reason: any) => IPromise<U>): IPromise<U>; 
     fin(finallyCallback:() => any): IPromise<T>; 
    } 
} 

Наконец, я обновленный ES5-подкладку, чтобы v4.5.7 как часть моей модернизации, которая, кажется, сломать IE8 тоже, хотя у меня нет идея как/почему на данный момент. Я понятия не имею, какую версию я использовал раньше (не могу найти номер версии в файле .js), так как я вручную скопировал ее в течение длительного времени. Мне пришлось вернуться к v4.1.7, чтобы найти версию, которая сработала, поэтому, вероятно, это что-то в версии 4.18, которая разбивает IE8.

Со всем этим вещи, похоже, снова работают в IE8!

Смежные вопросы