0

所以正如问题标题所说,我的 $rootScope 中有一个对象(我们称之为 $rootScope.appConfiguration),它在我的模块的 .run 中有一个值:

angular.module('myapp',[...])
.provider('appConfigurationProvider',function(){...})
.constant(...)
.run(function($rootScope) {
$rootScope.appConfiguration = appConfiguration;
});

( ... 部分只是跳过代码,以使内容更具可读性)

然后我在我的 index.html 中实现angulartics-piwik

<body ng-app>

<!-- Piwik -->
<script type="text/javascript">
var _paq = _paq || [];
//_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
    var u = appConfiguration.PiwikUrl;
    _paq.push(['setTrackerUrl', u + 'piwik.php']);
    _paq.push(['setSiteId', appConfiguration.PiwikSiteId]);
    var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
    g.type = 'text/javascript';
    g.async = true;
    g.defer = true;
    g.src = u + 'piwik.js';
    s.parentNode.insertBefore(g, s);
})();
</script>
<!-- End Piwik Code -->
...

如您所见,我想使用我的 appConfiguration 对象 PiwikUrl 和 PiwikSiteId 中的 2 个值,但我不知道如何在 javascript 中“传递”该对象。显然,由于现在的代码,我收到“appConfiguration 未定义”错误消息。

4

2 回答 2

1

我建议使用不同的方法,使用服务和配置常量(您可以将它们组合在提供程序中):

常量定义:

angular.module('myApp')
  .constant('AppConfiguration', { ... });

服务:

angular.module('myApp')
  .factory('PiwikService', ['$window', 'AppConfiguration',
    function($window, AppConfiguration) {
      return {
        init: function() {
          $window._paq = $window._paq || [];

          var _paq = $window._paq;
          _paq.push(['enableLinkTracking']);

          var u = AppConfiguration.PiwikUrl;

          _paq.push(['setTrackerUrl', u + 'piwik.php']);
          _paq.push(['setSiteId', AppConfiguration.PiwikSiteId]);

          var g = angular.element('<script>')[0], 
              s = angular.element(document).find('script')[0];

          g.type = 'text/javascript';
          g.async = true;
          g.defer = true;
          g.src = u + 'piwik.js';
          s.parentNode.insertBefore(g, s); 
        }
      };
    }
  ]);

然后,您可以使用这个新服务在运行块中初始化 Piwik。

angular.module('myApp',[...])
  .run(['PiwikService',
    function(PiwikService) {
      PiwikService.init();
    }
  ]);
于 2017-01-18T13:52:49.483 回答
0

将变量推送到window全局对象中。如下所示,然后像window.objectname在您的 piwik 配置脚本中一样访问它。

添加此代码以添加appConfiguration到窗口对象中。

window.appConfiguration = $rootScope.appConfiguration ; 

然后在您的 piwik 配置中,您可以像访问它一样访问它

var _paq = _paq || [];
//_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
    var u = window.appConfiguration.PiwikUrl;
    _paq.push(['setTrackerUrl', u + 'piwik.php']);
    _paq.push(['setSiteId', window.appConfiguration.PiwikSiteId]);
    var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
    g.type = 'text/javascript';
    g.async = true;
    g.defer = true;
    g.src = u + 'piwik.js';
    s.parentNode.insertBefore(g, s);
})();

更新:

angular.element(document).ready(function () {
    // put your piwik code here
});
于 2017-01-18T13:25:39.137 回答