我有一个指令,它将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创建得很好。但是,当我离开具有漂亮指令的视图时,角度会抛出错误并且整个应用程序会中断:
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对象的结果。
我宁愿不对angular.js源做任何更改(我试图使角度跳过匿名函数,但这打破了更多的东西)并且swiffy运行时不可用,因此我不确定是什么正在那里。任何想法都会很棒,谢谢。