Как вы получаете Angular.js для работы в приложении для магазина Windows 8?
Приложение работает, но Angular объекты данных не распознаются.
Вот ошибка JavaScript, которую я получаю:
Exception was thrown at line 1059, column 11 in ms-appx://28934b41-4dd2-4414-b9a9-
a73c11c1b743/js/angular.js
0x800a139e - JavaScript runtime error: No module: ngLocale
Exception was thrown at line 4473, column 9 in ms-appx://28934b41-4dd2-4414-b9a9-
a73c11c1b743/js/angular.js
0x800a139e - JavaScript runtime error: HierarchyRequestError
The program '[5112] WWAHost.exe' has exited with code 1 (0x1).
Вот функция вокруг строки 1059 в angular.js:
return ensure(modules, name, function() {
if (!requires) {
throw Error('No module: ' + name);
}
И вот функция вокруг линии 4473:
if (parent) {
parent.replaceChild(newNode, oldNode);
}
Я смог исправить первую ошибку, с которой я столкнулся:
Unhandled exception at line 2031
JavaScript runtime error: Unable to add dynamic content
обернув все angular.js с помощью MSApp.execUnsafeLocalFunction
MSApp.execUnsafeLocalFunction(function () {
....
});
Эти ошибки взяты из тестового приложения, которое я создал после примера списка дел с домашней страницы angular.js.
Теперь что? Согласно бесплатному событию Microsoft, которое я посетил, "легко добавить любую стороннюю инфраструктуру/библиотеку JavaScript в приложение Windows 8". Возможно, я новичок в этом... но я не думаю, что это очень просто!
Можно ли использовать angular.js с приложением Windows 8?
Ответы
Ответ 1
Причина в том, что Angular помещает теги html comment <!-- -->
для ng-repeat и аналогичных директив. К сожалению, Microsoft считает, что они небезопасны при вводе из Javascript с использованием .innertHTML и не разрешены. Это можно найти здесь:
http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx
Это происходит в строке 1534 в jQLite:
var div = document.createElement('div');
// Read about the NoScope elements here:
// http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx
div.innerHTML = '<div> </div>' + element; // IE insanity to make NoScope elements work!
div.removeChild(div.firstChild); // remove the superfluous div
Что происходит, это элемент
<!-- ngRepeat: item in arrayTest -->
Затем, когда Angular делает div.innerHTML =... элемент удаляется. Если вы поместите точку прерывания в div.removeChild, вы заметите, что div.innerHTML не имеет элемента.
[EDIT]
После написания этого ответа я попытался добавить
MSApp.execUnsafeLocalFunction(function () { div.innerHTML = '<div> </div>' + element });
Это работает! По-видимому, вы должны обернуть все углы в MSApp.execUnsafeLocalFunction, а затем эту строку.
Ответ 2
Я получил его, добавив ng-csp
в тег HTML в моем приложении для магазина. Это позволяет использовать политику безопасности контента, которая отключает такие вещи, как "eval". Я использовал jQuery (v2.1.1) и Angular (v1.3.0-beta.13).
Подробнее о ng-csp
в Документация AngularJS.
Ответ 3
в моем случае я завернул angularjs с MSApp.execUnsafeLocalFunction, и я использовал только data-ng-repeat вместо ng-repeat