删除重音和符号slugify,但最后留下短划线。
我也会在控制器之间共享相同的功能,怎么做?
代码:
$scope.slugify = function(slug){
str = slug.replace("-");
str = angular.lowercase(str);
str = str.replace(/[^A-Z0-9]+/ig, "-");
$scope.item.slug = str;
}
示例:
来源:内马尔是最好的球员! return: neymar-the-best-player-
[解决]
答案 0 :(得分:1)
要公开它,有一个必要的步骤来返回一些东西。然后你可以把它包装成list
并注入任何控制器。
constant
同样从函数应用的转换的性质来看,它符合app.controller('MainCtrl', function($scope, slugify) {
$scope.show = function(){
alert(slugify($scope.someText));
}
});
app.constant('slugify', function(slug){
str = slug.replace("-");
str = angular.lowercase(str);
str = str.replace(/[^A-Z0-9]+/ig, "-");
return str;
});
。
filter
在模板中使用这样的
app.filter('slugifyFilter', function(){
return function(slug){
str = slug.replace("-");
str = angular.lowercase(str);
str = str.replace(/[^A-Z0-9]+/ig, "-");
return str;
}
});
中查看此操作
答案 1 :(得分:1)
主要问题:
删除重音和符号slugify,但在最后留下短划线。
在我们讨论主要问题之前,您需要修补几部分代码。
replace()
语句适用于任何其他字符串之间的破折号,但如果破折号放在字符串的两端,肯定会出现问题。 e.g。 '-Some-Text-'
结果为'undefinedSome-Textundefined'
要解决此问题,您需要为replace()
添加一个空字符串的第二个参数。
自:
str = slug.replace("-");
要:
str = slug.replace('-', '');
replace()
语句有一个正则表达式标志,表示i
,表示不区分大小写的搜索。虽然您的正则表达式语句建议使用A-Z
(大写表达式),但这实际上是多余的,因为您已经将字符串修改为小写。所以声明应该改变:自:
str = str.replace(/[^A-Z0-9]+/ig, "-");
要:
str = str.replace(/[^a-z0-9]+/g, "-");
在#2
中的代码之后添加此替换语句str = str.replace(/^-+|-+$/g, '');
从我在你的代码中看到的,这似乎更像是一个可重用的函数,而不是一个可以归结为控制器函数的东西。您可以为此特定功能创建服务,并将其注入控制器。
<强> DEMO 强>
.controller('SluggerController', function($scope, slugify) {
$scope.slug = 'Neymar the best player!';
$scope.item = { slug: '' };
$scope.slugify = function(slug) {
$scope.item.slug = slugify(slug);
};
})
.factory('slugify', function() {
return function(text) {
return angular.lowercase(text)
.replace('-', '')
.replace(/[^a-z0-9]+/g, '-')
.replace(/^-+|-+$/g, '');
};
});
<强>更新强>
由于您不希望将unicode字符包含为虚线字符,因此您可以将其与#2合并。
<强> DEMO 强>
而不是:
str = str.replace(/[^a-z0-9]+/g, "-");
将其更改为:
str = str.replace(/[^\u00BF-\u1FFF\u2C00-\uD7FF\w0-9]/g, '-');
至于我如何获得正则表达式,您可以参考 SO comment