访问angularjs中视图内的配置常量

时间:2014-09-06 11:08:04

标签: angularjs angularjs-directive angularjs-scope web-analytics

我在下面的模块上配置了一个常量(我的实际场景的简化版本):

var app = angular.module('app', []);
angular.config('AnalyticsConstant', function(){
  property: {
    click: 'clicked',
    swipe: 'swiped',
    externalLink: 'opened external link'        
  },
  page: {
    message: {
    list: 'Message listing',
    show: 'Message show'
    }
  }
}

现在我基于用户采取的操作(比如刷卡),我想触发一个分析事件。由于滑动/单击或识别元素是否具有外部链接,是在视图级别完成的,我想将哈希传递给我的控制器方法。

例如:

 <ion-list>
  <ion-item ng-repeat="message in messages track by $index" ui-sref="message_path({id: message.id})" class="item-text-wrap">
    <my-track-directive source='message', property='click'>
  </ion-item>  
 </ion-list>

在myTrackDirective中,我可以读取这两个值,并检查AnalyticsConstant中是否有源/属性键可用。一旦找到,我还必须检查该值是否是AnalyticsConstant.source / property hash中的另一个键。另一个痛苦是,我需要对密钥源/属性进行字符串化,以便我可以检查哈希,但这不是问题。

我想知道我是否可以在视图中访问AnalyticsConstant,以便指令行变为:

    <my-track-directive source='AnalyticsConstant[page][message][list]', userAction='AnalyticsConstant[property][click]'>

我能想到三个解决方案:

  • 添加注入根范围。即

app.run(function($rootScope, AnalyticsConstant){ $rootScope.analyticsConstant = AnalyticsConstant }

但这不是一个好的解决方案,好像错误地将$rootScope.analyticsConstant更改为其他内容,整个功能可能会被搞砸。

  • 在每个控制器中注入并将其设置为$ scope level。

$scope.analyticsConstant = AnalyticsConstant

这将是很多重复。此外,它也不能确保$scope.analyticsConstant不会被错误地破坏。(虽然灾难也将受到限制并且有限:))

  • 编写一个函数,在“module.run”中返回AnalyticsConstant,或者可以在每个控制器中。

function getAnalyticsConstant = function(){ return AnalyticsConstant }

我特别喜欢第三种方法。但问题仍然存在于何处(rootScope或控制器范围)?

我的问题是:

  1. 有没有更好的方法来访问角度中配置的常量内部视图?
  2. 上面列出的每种方法可能存在哪些其他问题?
  3. 指令方法是否更好,还是应该在某个模型中收集此数据,然后将其传递给分析事件函数?
  4. 由于

1 个答案:

答案 0 :(得分:2)

我会使用value来定义常量:

app.value('AnalyticsConstant', function(){
  property: {
    click: 'clicked',
    swipe: 'swiped',
    externalLink: 'opened external link'        
  },
  page: {
    message: {
    list: 'Message listing',
    show: 'Message show'
    }
  }
}

因此,在每个控制器/指令中,您只需创建实例,例如:

app.directive('myTrackDirective', ['AnalyticsConstant', function(AnalyticsConstant) {
        return {
            restrict: 'E',
            replace: true,
             scope: {/* ... */},
            templateUrl: 'some.html',

            link: function(scope) {
              scope.AnalyticsConstant = AnalyticsConstant;
            }
        };
    }]);

您可以从HTML

中调用AnalyticsConstant

作为旁注(不提问题):

尝试使用 MixPanel 。适用于Cordova-Ionic-Angular