尝试使用 ng-model 将空格替换为破折号

问题描述 投票:0回答:4

我是 AngularJS 的新手,正在尝试创建一个简单的应用程序,该应用程序允许我将文件上传到我的 Laravel 驱动的网站。我希望表单能够向我显示上传项目的预览。所以我使用 ng-model 来实现这一点,我偶然发现了以下内容:

我有一个带有一些基本引导样式的输入,并且我正在使用 AngularJS 模板的自定义括号(因为正如我提到的,我正在使用 Laravel 及其刀片系统)。我需要从输入中删除空格(当我输入时)并用破折号替换它们:

<div class="form-group"><input type="text" plaeholder="Title" name="title" class="form-control" ng-model="gnTitle" /></div>

然后我有这个:

<a ng-href="/art/[[gnTitle | spaceless]]" target="_blank">[[gnTitle | lowercase]]</a>

我的 app.js 看起来像这样:

var app = angular.module('neoperdition',[]);

app.config(function($interpolateProvider){
    $interpolateProvider.startSymbol('[[').endSymbol(']]');
});

app.filter('spaceless',function(){
    return function(input){
        input.replace(' ','-');
    }
});

我收到以下错误: 类型错误:无法读取未定义的属性“替换”

我知道我需要在过滤之前定义该值,但我不确定在哪里准确定义它。而且,如果我定义了它,我不希望它改变我的占位符。

angularjs angularjs-filter angular-ngmodel
4个回答
17
投票

您的过滤器中缺少一些东西。首先,您需要返回新字符串。其次,正则表达式不正确,您应该使用全局修饰符来替换所有空格字符。最后,您还需要检查字符串是否已定义,因为最初模型值可以是

undefined
,因此未定义的
.replace
会抛出错误。

大家一起:

app.filter('spaceless',function() {
    return function(input) {
        if (input) {
            return input.replace(/\s+/g, '-');    
        }
    }
});

演示:http://plnkr.co/edit/5Rd1SLjvNI18MDpSEP0a?p=preview


1
投票

Bravi 试试这个过滤器 例如 {{X |将空格替换为短划线}}

 app.filter('replaceSpaceToDash', function(){
                var replaceSpaceToDash= function( input ){

                        var words = input.split( ' ' );
                         for ( var i = 0, len = words.length; i < len; i++ )
                             words[i] = words[i].charAt( 0 ) + words[i].slice( 1 );
                         return words.join( '-' );
                     };
                     return replaceSpaceToDash;
            });

0
投票

如果您使用的是新的 Angular 版本并且

[(ngModel)]="title"
,您可以像这样使用 getter 和 setter:

private _title: string = '';

public set title(title: string) {
    this._title = title.replace(/\s+/g, '-');
}
public get title(): string {
    return this._title;
}

但是有很多方法可以处理这个问题,例如使用带有事件的表单控件,或者指令等等。


-1
投票

首先,您必须通过将过滤器的名称添加到数组中来将过滤器注入到模块中:

var app = angular.module('neoperdition',['spaceless']);

其次,过滤器的函数必须返回一些东西。 String.prototype.replace() 返回一个新的 String 。所以你必须退货:

app.filter('spaceless',function(){
    return function(input){
        return input.replace(' ','-');
    }
});

编辑:dfsq 的答案比我的准确得多。

© www.soinside.com 2019 - 2024. All rights reserved.