我在下面的模块上配置了一个常量(我的实际场景的简化版本):
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.analyticsConstant = AnalyticsConstant
这将是很多重复。此外,它也不能确保$scope.analyticsConstant
不会被错误地破坏。(虽然灾难也将受到限制并且有限:))
function getAnalyticsConstant = function(){
return AnalyticsConstant
}
我特别喜欢第三种方法。但问题仍然存在于何处(rootScope或控制器范围)?
由于
答案 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