这是我的问题:我在这里有这个小的 JS 程序,其中有 2 个控制器。我的问题是我在两个控制器中都需要一个函数(data.duration)。因为一次我需要功能本身的功能和摘要一次。顺便说一句,我通过 JSON 报告获取我的信息,如果它是一个特性或只是一个值,该函数会自我证明。当时该函数在代码中出现了 2 次......
那么有没有办法在两个控制器中使用该功能?
(function() {
var loader = ['$http',
function($http) {
return $http.get('report.json')
.success(function(data) {
function getFailedScenarioCount(feature) {
var failedScenarios = 0;
feature.scenarios.forEach(function(scenario) {
if (scenario.result.failedStepCount)
failedScenarios++;
});
return failedScenarios;
}
function getUnknownScenarioCount(feature) {
var unknownScenarios = 0;
feature.scenarios.forEach(function(scenario) {
if (scenario.result.unknownStepCount)
unknownScenarios++;
});
return unknownScenarios;
}
angular.forEach(data.features, function(feature) {
if (feature.scenarios.length) {
feature.result.failedScenarioCount = getFailedScenarioCount(feature);
feature.result.unknownScenarioCount = getUnknownScenarioCount(feature);
feature.result.passedScenarioCount = feature.result.scenarioCount - feature.result.failedScenarioCount - feature.result.unknownScenarioCount;
if (feature.result.failedScenarioCount === 0)
feature.result.failedScenarioCount = null;
if (feature.result.unknownScenarioCount === 0)
feature.result.unknownScenarioCount = null;
if (feature.result.passedScenarioCount === 0)
feature.result.passedScenarioCount = null;
}
feature.status = feature.result.failedScenarioCount ? "FAILED" : "OK";
angular.forEach(feature.scenarios, function(scenario) {
angular.forEach(scenario.steps, function(step) {
if (step.result.status === "undefined")
step.result.status = "unknown";
});
scenario.status = scenario.result.failedStepCount ? "failed" : (scenario.result.unknownStepCount ? 'unknown' : 'passed');
});
});
data.duration = function(feature) {
var day = 0;
var h = 0;
var min = 0;
var sec = 0;
var value = 0;
var substract = function(v, b) {
var result = v - (b);
return result;
};
if (isNaN(feature)) {
value = feature.result.duration;
} else {
value = feature;
}
console.log("value: " + value);
if (value % (1000000000 * 60 * 60 * 24) >= 0) //day
{
day = (value / (1000000000 * 60 * 60 * 24)) | 0;
value = substract(value, (day * (1000000000 * 60 * 60 * 24)));
}
if (value % (1000000000 * 60 * 60) >= 0) //hour
{
h = (value / (1000000000 * 60 * 60)) | 0;
value = substract(value, (h * (1000000000 * 60 * 60)));
if (h % 24 === 0 && h !== 0) {
day++;
h = 0;
}
}
if (value % (1000000000 * 60) >= 0) //minute
{
min = (value / (1000000000 * 60)) | 0;
value = substract(value, (min * (1000000000 * 60)));
if (min % 60 === 0 && min !== 0) {
h++;
min = 0;
}
}
if (value % (1000000000) >= 0) //second
{
sec = (value / (1000000000)) | 0;
value = substract(value, (sec * (1000000000)));
if (sec % 60 === 0 && sec !== 0) {
min++;
sec = 0;
}
}
if (day === 0 && h === 0 && min === 0 && sec === 0) {
var msec = 0;
if (value % 1000000 >= 0) {
msec = (value / 1000000) | 0;
}
return msec > 0 ? msec + 'ms' : '<1ms';
} else if (day > 0) {
return (' ' + '(' + day + 'Day/s) ' + ' ' + ' ' + h + ' ' + ':' + ' ' + min + ' ' + ':' + ' ' + sec);
} else {
return (' ' + h + ' ' + ':' + ' ' + min + ' ' + ':' + ' ' + sec);
}
};
});
}
];
var app = window.angular.module('cucumber', ['ui.bootstrap']);
app.config(['$routeProvider',
function($routeProvider) {
$routeProvider.when('/features', {
templateUrl: 'features.html',
controller: 'FeatureListCtrl',
resolve: {
report: loader
}
}).when('/feature/:featureId', {
templateUrl: 'feature.html',
controller: 'FeatureCtrl',
resolve: {
report: loader
}
}).otherwise({
redirectTo: '/features'
});
}
]);
app.controller('FeatureListCtrl', function($rootScope, $scope, $location, $filter, report) {
$scope.report = report.data;
$rootScope.reportDate = $scope.report.date;
$scope.duration = $scope.report.duration;
$scope.featureDetails = function(feature) {
$location.path('/feature/' + feature.id);
};
$scope.sum = function(features, field) {
if (!features) return null;
var sum = features.reduce(function(sum, feature) {
var value = parseInt(feature.result[field], 10);
return isNaN(value) ? sum : sum + value;
}, 0);
return sum > 0 ? sum : null;
};
$scope.$watch("searchText", function(query) {
$scope.filteredFeatures = $filter("filter")($scope.report.features, query);
});
$scope.isCollapsed = true;
});
app.controller('FeatureCtrl', function($rootScope, $scope, $location, $routeParams, report) {
$scope.duration = report.data.duration;
function getFeature(featureId, features) {
for (var i = 0; i < features.length; i++) {
if (featureId === features[i].id) {
return features[i];
}
}
}
$scope.feature = getFeature($routeParams.featureId, report.data.features);
$rootScope.reportDate = report.data.date;
});
}());