AngularJS 1.5错误引导IBM Mobilefirst

14

我似乎在结合一个没有cordova的MFP混合应用和angular 1.5方面存在问题。使用angular 1.4.9的同样应用程序可以正常工作,但是如果我切换到angular 1.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。 - Nazmul Hasan
我在这个项目中使用了ui-router。 - Kenneth Van den Berghe
你能分享类似的演示项目吗? - Nazmul Hasan
@KennethVandenBerghe你使用的MobileFirst版本是哪个? MobileFirst中的每个混合应用都基于Cordova。 - Yuval Zymerman
2
从阅读日志和当您更改Angular版本时它可以工作的事实来看,我认为它与MobileFirst关系不大,而更多地涉及AngularJS。 - Yuval Zymerman
显示剩余4条评论
3个回答

3
我在升级到angular 1.5.0时遇到了完全相同的问题。
问题实际上出现在我们代码中自定义的Function.prototype.bind实现上,它似乎与angular定义的bind发生了冲突。请注意您错误调用堆栈的第二行。
at new <anonymous> (http://localhost:10080/Hybrid/apps/services/preview/HelloWorld/android/1.0/default/worklight/worklight.js:1033:23)

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


你是否遇到了与Worklight相同的问题,还是有不兼容Angular的其他代码片段?如果是Worklight的问题,你是如何解决的? - Kenneth Van den Berghe
这是使用内部库完成的,我没有使用Worklight。我猜测某个Worklight库具有Function.prototype.bind的自定义实现,建议您在包含Worklight JS文件后再包含angular.js文件,以便angular覆盖Worklight而不是相反。 - pauloya

0

正如其他人所提到的,这可能是由于Function.prototype.bind的polyfills引起的。特别是,似乎是由于那些不能正确处理使用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上找到的场景。

0

同样在MFP 8.0 Cordova插件上看到了这个。


你找到解决方案了吗? - iqueqiorio
您可以在这里找到MFP 8.0 Cordova插件的解决方法。 - Vittal Pai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接