设置
我有一个指令,它将 json 文件的路径作为属性值,加载 json,然后实例化 Swiffy:
angular.module('myApp')
.directive('swiffy', function ($http) {
return {
restrict: 'A',
scope: {},
link: function postLink($scope, $element, attrs) {
var stage;
// Listen to angular destroy
$scope.$on('$destroy', function() {
if(stage) {
stage.destroy();
stage = null;
}
});
// Load swiffy json
$http({
method: 'GET',
url: attrs.swiffy
}).success(function(data, status, headers, config) {
stage = new swiffy.Stage( $element[0], data );
stage.start();
}).error(function(data, status, headers, config) {
});
}
};
});
标记:
<div swiffy="my-animation.json"></div>
我还有一个基本的路由设置:
angular
.module('myApp', [
'ngCookies',
'ngResource',
'ngSanitize',
'ngRoute'
])
.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/main.html',
controller: 'MainCtrl'
})
.when('/info', {
templateUrl: 'views/info.html',
controller: 'InfoCtrl'
})
.otherwise({
redirectTo: '/'
});
});
这里的控制器是空的。
问题
json 文件按应有的方式加载,并且 Swiffy svg 被创建得很好。但是,当我离开具有 swiffy 指令的视图时,角度会引发错误并且整个应用程序会中断:
TypeError: Cannot read property '1' of null
at annotate (angular.js:3179:24)
at Object.invoke (angular.js:3846:21)
at angular.js:5580:43
at Array.forEach (native)
at forEach (angular.js:323:11)
at Object.<anonymous> (angular.js:5578:13)
at Object.invoke (angular.js:3869:17)
at angular.js:3711:37
at Object.getService [as get] (angular.js:3832:39)
at addDirective (angular.js:6631:51)
在指令中触发 '$destroy' 事件后引发错误,因此我知道 stage.destroy() 已在 Swiffy 对象上运行。
可以在此处找到引发错误的 angularjs 函数https://github.com/angular/bower-angular/blob/7ae38b4a0cfced157e3486a0d6e2d299601723bb/angular.js#L3179
据我所知, annotate() 试图读取匿名函数的参数并失败。如果我删除 Swiffy 实例化,我没有错误,因此错误必须是创建 Swiffy 对象的结果。
我在用着:
- AngularJS 1.2.16
- Swiffy 运行时版本 6.0.2
到目前为止,我已经尝试过:
- 更新到 AngularJS 版本 1.2.17-build.111+sha.19d7a12。(它包含对 annotate 函数的更新,但这并不能解决问题)
- 从指令中删除了“严格模式”。
- 删除 stage.destroy()
我宁愿不对 angular.js 源代码进行任何更改(我试图让 Angular 跳过匿名函数,但这破坏了更多的东西)并且 swiffy 运行时不可用,所以我不确定发生了什么在那里。任何想法都会很棒,谢谢。