你如何让Angular.js在Windows 8商店应用程序中工作?

时间:2012-10-09 03:21:38

标签: javascript angularjs windows-8 microsoft-metro winjs

应用程序运行但无法识别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).

这是angular.js中第1059行的函数:

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

MSApp.execUnsafeLocalFunction

包装所有angular.js
  MSApp.execUnsafeLocalFunction(function () {
          ....
      });   

这些错误来自我在Angular.js主页上的待办事项列表示例后创建的测试应用程序。

现在怎样?根据我参加的免费微软活动,“很容易将任何第三方JavaScript框架/库添加到Windows 8应用程序中!”我可能是新手......但我不认为这很容易!

甚至可以将Angular.js与Windows 8应用程序一起使用吗?

3 个答案:

答案 0 :(得分:23)

原因是因为Angular为ng-repeat和类似指令添加了html注释<!-- -->标记。不幸的是,当使用.innertHTML从Javascript中输入时,Microsoft认为这些是不安全的,并且是不允许的。这可以在这里找到:

http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

它出现在jQLite的第1534行:

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>&#160;</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没有元素。

[编辑] 写完这个回复后,我尝试添加

MSApp.execUnsafeLocalFunction(function () { div.innerHTML = '<div>&#160;</div>' + element });

有效!显然你必须在MSApp.execUnsafeLocalFunction中包装所有angularjs,然后专门包装那行。

答案 1 :(得分:4)

我通过将ng-csp添加到我的商店应用中的HTML标记来实现它。这会启用内容安全策略,该策略会禁用诸如“评估”之类的内容。我使用了jQuery(v2.1.1)和Angular(v1.3.0-beta.13)。

AngularJS documentationng-csp的更多内容。

答案 2 :(得分:1)

在我的情况下,我使用 MSApp.execUnsafeLocalFunction 包装angularjs,我只使用data-ng-repeat而不是ng-repeat