6

设置

我有一个指令,它将 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.17-build.111+sha.19d7a12。(它包含对 annotate 函数的更新,但这并不能解决问题)
  • 从指令中删除了“严格模式”。
  • 删除 stage.destroy()

我宁愿不对 angular.js 源代码进行任何更改(我试图让 Angular 跳过匿名函数,但这破坏了更多的东西)并且 swiffy 运行时不可用,所以我不确定发生了什么在那里。任何想法都会很棒,谢谢。

4

0 回答 0