【问题标题】:AngularJS 1.5 error bootstrap IBM MobilefirstAngularJS 1.5 错误引导 IBM Mobilefirst
【发布时间】:2016-06-16 22:08:29
【问题描述】:

我似乎在将 MFP 混合(无 cordova)应用程序和 angular 1.5 结合起来时遇到问题。使用 angular 1.4.9 的相同应用程序可以正常工作,但如果我切换到 angular1.5,则会出现此错误:

Error: [$injector:modulerr] Failed to instantiate module ng due to:
TypeError: Cannot set property 'aHrefSanitizationWhitelist' of null
at $$SanitizeUriProvider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:17272:35)
at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)
at Object.instantiate (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4621:14)
at provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4435:36)
at http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:367:32
at forEach (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:337:20)
at Object.provider (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4425:9)
at ngModule (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:2476:16)
at Object.invoke (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4606:19)
at runInvokeQueue (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/vendor/angular5.js:4499:35)
http://errors.angularjs.org/1.5.0/$injector/modulerr?p0=ng&p1=TypeError%3A%…%2FHelloWorld%2Fandroid%2F1.0%2Fdefault%2Fvendor%2Fangular5.js%3A4499%3A35)

有人知道它可能是什么吗?

【问题讨论】:

  • ngRoute 模块不再是核心 angular.js 文件的一部分。如果你继续使用 $routeProvider 那么你现在需要在你的 HTML 中包含 angular-route.js
  • 我在这个项目中使用了ui-router。
  • 嗯,你能分享类似的演示项目吗?
  • @KennethVandenBerghe 您使用的是哪个版本的 MobileFirst?基于 Cordova 的 MobileFirst Hybrid 中的每个混合应用程序。
  • 从阅读日志以及更改 Angular 版本时它可以工作的事实来看,在我看来,它与 AngularJS 的关系比 MobileFirst 更重要。

标签: angularjs ibm-mobilefirst


【解决方案1】:

当我升级到 Angular 1.5.0 时,我遇到了完全相同的问题。
问题出在我们在代码中的 Function.prototype.bind 的自定义实现上,看起来这与 angular 中定义的实现有冲突。

在你的错误调用堆栈的第二行

at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)

我认为 worklight.js 可能有一个 prototype.bind 的实现,它与 angular 中的不兼容(参见 https://code.angularjs.org/1.5.0/docs/api/ng/function/angular.bind

【讨论】:

  • 您是否遇到过与 worklight 相同的问题,或者是与 angular 不兼容的另一段代码?如果是工作灯,您是如何解决问题的?
  • 这是一个内部库,我没有使用工作灯。我猜一些worklight库有Function.prototype.bind的自定义实现,我建议你在包含worklight JS文件之后包含angular.js文件,这样angular会覆盖worklight,而不是相反。跨度>
【解决方案2】:

在 MFP 8.0 cordova 插件上也看到了这一点。

【讨论】:

  • 你找到解决办法了吗
  • 您可以找到 MFP 8.0 Cordova 插件的解决方法here
【解决方案3】:

正如其他人所提到的,这可能是由 Function.prototype.bind 的 polyfill 引起的。特别是,它似乎是由于没有正确处理调用函数作为构造函数与 new 引起的。无论调用如何,简单的实现都可能总是返回绑定的对象,而期望是 new 运算符优于绑定,而是返回新创建的对象。

例如。

// create an object to bind to
var alt = {
    message: 'I am the alternate'
};

// our function
function myFunc() { 
   console.log( this.message );
};

// bind our alternate object to this for myFunc
myFunc.bind( alt );

标准调用按预期运行

myFunc(); // output 'I am the alternate'

通过 new 调用不是预期的(这是打破 angular 1.5 的调用)

new myFunc(); // also outputs 'I am the alternate'</jscodeblock>

预期的行为是 new 调用将返回一个新对象,而不是绑定的对象。

如果您需要 Function.prototype.bind 的 polyfill,请确保它正确处理这种情况,例如在 MDN 上找到的情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-18
    • 2015-07-24
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多