Solvedangular I'd like to be able to use ngModel without specifying a name

feature request

Current behavior
If opted into the new forms and I have code like this:

<form (submit)="process()">
 <input [(ngModel)]="propertyName">

And this throws an error: ORIGINAL EXCEPTION: Name attribute must be set if ngModel is used within a form.

Expected/desired behavior
I'd like to be able to use html forms and submit capabilities (such as submitting with the enter key) without having to specify a name (and use FormGroups and FormControls) for my ngModel bound inputs.

  • Angular version: 2.0.0-beta.RC2
33 Answers

✔️Accepted Answer


Thank you all for the great feedback - very helpful! Here's how we are thinking about it:

In the case that you don't want to register a form control, you currently have a few options:

1 - Use ngModel outside the context of a form tag. This will never throw.

<input [(ngModel)]="">         

2 - Use an ngNoForm attribute on the parent form tag to indicate you don't want Angular form support

<form ngNoForm>
   <input [(ngModel)]="">         

Unfortunately, neither of these approaches are appropriate for the use case a few of you brought up where you might want some form controls registered in a form but not others. We should definitely support this case, so thanks for bringing it up. However, there are a few ways to approach this, and when considering a solution, dropping the error entirely is not ideal for two reasons:

1- It's not clear what's wrong if the name attribute is missing

We want to ensure a good developer experience for those starting out with forms. Having the form silently fail to pick up a form control's value and validation state in some cases is confusing. It appears that the forms module is simply broken. Throwing a friendly error is much more explicit, and provides immediate feedback to the developer about how to fix the form.

2- The "name" attribute becomes the gatekeeper for form registration

It seems arbitrary that the presence of a "name" attribute is what dictates the form control's relationship to its parent form. Currently, it's clear that the ngModel directive confers form functionality like validation state. If the "name" attribute controls the input's registration with its parent, then it muddies that concept and causes confusion about the relative effects of adding ngModel vs. a name (e.g. can you use the "name" attribute without ngModel, since it is responsible for form registration?)

After considering the possibilities, we've decided to add an option to ngModelOptions to indicate a form control is "standalone". This allows developers to mark that certain controls shouldn't be registered with the parent form if necessary. In other words, within a form, an input needs either a name attribute or a standalone marker.

   <input [(ngModel)]="" [ngModelOptions]="{standalone: true}">         

It is preferable to have developers explicitly and deliberately indicate that they'd like to override the default behavior, rather than making an assumption based on the absence of an attribute. Using ngModelOptions is a natural choice because it is a clear extension of ngModel (rather than a distinct attribute or directive).

This is a bit more boilerplate to write for these special controls, but it seems like this is an acceptable tradeoff given that this is the less common use case. This way, developers can still create special standalone controls, but the standard developer experience is not degraded.

See PR: #9522

Other Answers:

@wrldtrvllr that's the exact case I'm dealing with. My dynamic form element (which renders a specific custom form element based on meta data from the API) breaks now in RC2 because it doesn't have a name, nor does it need one. In fact, in that case, name makes absolutely no sense.

@kara Could you please rethink the name "standalone". It leaves me standing alone. From reading it I absolutely cannot infer what it means without the explanation you've given. Wouldn't be

   <input [(ngModel)]="" [ngModelOptions]="{isModelProperty: false}">  <!-- Suggestion 1 -->
   <input [(ngModel)]="" [ngModelOptions]="{isFormProperty: false}">  <!-- Suggestion 2 -->
   <input [(ngModel)]="" [ngModelOptions]="{serialize: false}">  <!-- Suggestion 3-->

more in line with terminology used elsewhere for forms? You might notice that these properties use
inverse logic to standalone and "true" would be the default cases. I know, it seems tedious to have discussions about names etc. but many of the changes we have to deal with when porting forms from RC.1 are also because of the miserable naming chosen ealier. So please rethink if standalone is such a good fit.

The problem is that your forms will no longer behave predictably. In the example above, what would form.value be? There's no way to refer to the input you've added, so it would have to be {undefined: 'someval'}

If name is absent for an input it should simply not be serialized in the form's JSON.

Serializing to JSON should be an opt in approach (by providing name) not an opt out using ngModelOptions. In most cases I need to construct my own JSON from the input fields to conform to a web service's request. A form's JSON is not terribly useful in these cases.

Having to specify name at all times is simply bad ergonomics for the API.

Related Issues:

angular Angular5.x lazyLoad problem, undefined is not a function
For others that find this issue via Google as i did: I had the same problem when trying to lazy load...
angular Cyclic dependency error with HttpInterceptor
I resolved simply not setting authService in constructor but getting in the intercept function. ...
angular Uncaught Error: Can't resolve all parameters for ...
You are missing an @Injectable() annotation on your ApiService Support requests like these should li...
angular Force reload/refresh current route with RouteReuseStrategy
Hi If you really need to trick the Router into reloading the component on each routerLink click ...
angular Misleading error message "Cannot find a differ supporting object '[object Object]'"
I just ran into the same issue I'm not sure if the recommended solution will work for my case ...
angular update 2 to 4 has problem [ts] Property 'map' does not exist on type 'Observable<Response>'.
I met the same problem with the angular cli 6.0.0 and rxjs 6.1.0 And I solved the problem by replaci...
angular Angular2 AoT Compiler Errors
pls try /cc @chuckjaz When I try to compile my project with ngc it throws the below error: Error: Er...
angular HttpClient.delete() cannot handle a body in its request
It would be great to have body param in .delete() We just migrated our project to HttpClient and for...
angular Http - Observable completed function not firing
Third callback haven't been called when error occures ES6 promises hasn't method finally only then a...
angular Using multiple components in different modules causing "Type X is part of the declarations of 2 modules" error
as @brandonroberts saids create a shared module like this: then use the SharedModule like this.. ...
angular Unsupported platform for fsevents@1.0.14: wanted {"os":"darwin","arch":"any"} (current: {"os":"win32","arch":"x64"})
@DzmitryShylovich did you edit package.json only? if npm-shrinkwrap.json is still there please remov...
angular Angular v5 ngc compiler: Error encountered in metadata generated for exported symbol 'Subscription'
Got this problem I'm submitting a.. Current behavior Building an Angulary library using 5.0.0-beta.4...
angular 404 on route refresh in angular 4
Got it working Just adding .htaccess in root I'm submitting a.. Current behavior I created a new com...
angular routerLinkActive not updating when routerLink changed
I have a hack that seems to work After looking at the source code it looks like this.update() is als...
angular No provider for HttpClient!
If you are using angular v5 version import HttpClientModule in your app.module.ts after HttpModule T...
angular ɵDomAnimationEngine and ɵNoopAnimationEngine module missing in animations 4.2.1
@dubedoy I installed @angular/animations@4.1.3 and it worked again. I'm submitting a .. ...
angular Error: Runtime compiler is not loaded in angular6 --prod mode
Do not and i repeat do not import your feature modules in app module and also when addressing featur...
angular appending header in HttpHeaders from '@angular/common/http' doesn't work
@trotyl I didn't understand your comment I'm submitting a.. ...
angular Can't bind to 'formGroup' since it isn't a known property of 'form'
did you import ReactiveFormsModule? I'm submitting a .. ...
angular AOT Compiler requires public properties, while non-AOT allows private properties
@aluanhaddad you have a big misunderstanding in here There is no subset of Typescript in here No one...
angular [Bug] angular/elements: Failed to construct 'HTMLElement': Please use the 'new' operator
Hi I have solved this issue by changing the target:es5 in the tsconfig.json to target:es2015 these i...
angular Cannot run angular 2+ from file:/// - looks like 'base href="/"' is the issue
Thanks @Markovy @audrummer15 I got it working completely in a fairly complex angular 2 app with mult...
angular HttpClient fails to parse an empty 200 response in IE11
For my error I was able to fix the problem by setting the responseType: to 'text' in the options ...
angular Function calls are not supported in decorators when fullTemplateTypeCheck is not specified and @dynamic has no effect
Regarding Ward's repro: @wardbell The build will succeed / fail depending on the combination of angu...
angular error TS2451: Cannot redeclare block-scoped variable 'ngDevMode'
had to add this line in the main tsconfig I'm submitting a.. ...
angular Problem with ngFor
Wouldn't [(ngModel)]=testItems[i] do the trick? I think that the error is saying that you can assign...
angular Issue with importing Observable from rxjs/Rx (import-blacklisted)
You shouldn't import from 'rxjs' or 'rxjs/Rx' since either import will import the whole of rxjs whic...
angular [RC5]: Minified bundle breaks
@robertoforlani Hopefully someone will have time to write a comprehensive explanation soon In the me...
angular router-outlet is appending rather than replacing when using BrowserAnimationsModule
Trying this solved the problem for me: => { this.router.navigate(['/main']); }); Re...
angular Lazy loaded module in named outlet throws error
We have this Where proxy route component is simply [x] bug report [ ] feature request [ ] support re...
angular IVY Error NG6002: Appears in the NgModule.imports of AppModule, but could not be resolved to an NgModule class
Not sure this will provide anyone relief or assist with figuring out what the root cause is but clea...
angular How to run angular 2 application on apache hosting server
Sorry to rock the boat I hope this doesn't attract more questions I'm only going to comment once :) ...
angular Support adding rel=canonical link tags using an included service
Eventually there will be some DocumentService part of Core that will handle both Meta/Link elements ...
angular Concept of Angular (ngZone + ChangeDetection) better than concept React, Vue (Virtual DOM)?
Concept of Angular (ngZone + ChangeDetection) better than concept React Vue (Virtual DOM)? If you ca...
angular I'd like to be able to use ngModel without specifying a name
Thank you all for the great feedback - very helpful! Here's how we are thinking about it: In the cas...
angular Model values not trimming automatically in angular 2
@laskoviymishka White space it already something If you are a programmer and think globally - yes ...
angular HttpClient - HttpErrorResponse not json but blob
I created this interceptor as a temporary solution until this one is fixed: I'm submitting a.. ...
angular Router's ActivatedRoute data returns empty {} if module is lazy
data is available only with this hell-like construction: And this is if you have children: ...
angular Misleading errormessage when using HostBinding with @animation trigger but no defined animations
The error message is not fine The error message says you're importing BrowserAnimationsModule incorr...
angular Memory leak when FormControlName created/destroyed few times
This issue has been around for nearly 3 years now (I usually don't like to start a message this way ...
angular Remove System.import() usage in favor of import()
I use a parser rule in my webpack configuration to disable the warning:
angular Async event subscriber not updating UI after async call
Hi! The issue is that the async call result is outside ngZone thus not triggering the UI update You ...
angular Using router.navigate to navigate to another component does not invoke the onInit method
I have the same issue Angular is running in a Cordova app for iOS I tried the router-version 4.1.3 (...
angular Router: AoT compilation fails when using a function with loadChildren
Calling functions or calling new is not supported in metadata when using AoT This includes things li...
angular Provide a mock service using TestBed
I was having this issue as well however I noticed that my @component metadata still had the provider...
angular Angular2 download excel file from Web API, file is corrupt
@healkar01 I had the same issue and I resolved using native angular2 http request in this way: Backe...
angular 4.0.0-rc.6 [platform-server] - Cannot find module '@angular/animations/browser'. & other errors
(Just incase others find it) Make sure @angular/animations is installed as a dependency and the erro...
angular HttpClient mapping to typescript types not working
I agree with all the previous comments I find the syntax misleading widget.servic...