2016-01-13 6 views
13

Ok, das macht mich jetzt offiziell verrückt.Angular 2: Kann die Eigenschaft 'Validator' von undefined nicht lesen

Ich habe zwei Komponenten in meiner Angular 2 App im Moment, jeweils mit einem Formular. Das Anmeldeformular funktioniert gut, aber ich habe Probleme mit meiner Anmeldeform. Zuletzt habe ich die Anmelde-Komponente als Vorlage für die Anmelde-Komponente verwendet, um das Problem zu finden.

Ich habe alle außer den meisten erforderlichen Code aus der Klasse der Komponente und der Vorlage der Komponente beschnitten. Meine Komponente der Vorlage sieht derzeit wie folgt aus:

<link href="css/animation.css" rel="stylesheet"> 

<section id="signin_alt" class="authenty signin-alt"> 
    <form [ngFormModel]="signinForm" novalidate> 
    </form> 
</section> 

Meine Komponente Klasse sieht wie folgt aus:

import { Component } from 'angular2/core'; 
import { ControlGroup, FormBuilder, AbstractControl, Validators } from 'angular2/common'; 
import { RouterOutlet, RouterLink, RouteConfig, Router, ROUTER_DIRECTIVES } from 'angular2/router'; 
import { AuthenticationService } from './services/authentication.service'; 
import { AppComponent } from '../app.component'; 

@Component({ 
    selector: 'signin', 
    directives: [RouterOutlet, RouterLink], 
    template: require('./signin.component.html') 
}) 
export class SigninComponent { 
    signinForm: ControlGroup; 
} 

Wenn ich das entfernen [ngFormModel] aus dem Formular, es keine Fehler werfen. Wenn ich das Attribut hinzufügen, ich dieses köstliche Ergebnis:

EXCEPTION: TypeError: Cannot read property 'validator' of undefined in [signinForm in [email protected]:14] 

Aus Gründen der Vollständigkeit, hier ist mein webpack config:

var sliceArgs = Function.prototype.call.bind(Array.prototype.slice); 
var toString = Function.prototype.call.bind(Object.prototype.toString); 
var path = require('path'); 
var webpack = require('webpack'); 

module.exports = { 
    devtool: 'source-map', 
    debug: true, 
    devServer: { 
     historyApiFallback: true, 
     contentBase: 'src/public', 
     publicPath: '/__build__' 
    }, 
    entry: { 
     'app': './src/app/bootstrap', 
     'vendor': './src/app/vendor.ts' 
    }, 
    output: { 
     path: root('public/__build__'), 
     filename: '[name].js', 
     sourceMapFilename: '[name].js.map', 
     chunkFilename: '[id].chunk.js' 
    }, 
    resolve: { 
     extensions: ['', '.ts', '.js', '.json', '.css', '.html'] 
    }, 
    module: { 
     loaders: [ 
      { test: /\.json$/, loader: 'json' }, 
      { test: /\.css$/, loader: "style-loader!css-loader" }, 
      { test: /\.png$/, loader: "url-loader?limit=100000" }, 
      { test: /\.jpg$/, loader: "file-loader" }, 
      { test: /\.html$/, loader: 'html' }, 
      { 
       test: /\.ts$/, 
       loader: 'ts', 
       exclude: [/\.spec\.ts$/, /\.e2e\.ts$/, /node_modules/] 
      }, 
      { 
       test: /\.scss$/, 
       loaders: ['style', 'css?sourceMap', 'sass?sourceMap'] 
      }, 
      { 
       test: /\.(woff|woff2)(\?v=[0-9]\.[0-9]\.[0-9])?$/, 
       loader: "url-loader?limit=10000&minetype=application/font-woff" 
      }, 
      { 
       test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/, 
       loader: "file-loader" 
      } 
     ] 
    }, 
    plugins: [ 
     new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: 'vendor.bundle.js' }), 
     new webpack.ProvidePlugin({ $: "jquery", jQuery: "jquery" }) 
    ] 
}; 

function root(args) { 
    args = sliceArgs(arguments, 0); 
    return path.join.apply(path, [__dirname].concat(args)); 
} 

function rootNode(args) { 
    args = sliceArgs(arguments, 0); 
    return root.apply(path, ['node_modules'].concat(args)); 
} 

an dem Stack-Trace Blick scheint es, die Form nicht ist instanziiert werden. Der Fehler wird in dieser Winkelfunktion ausgelöst:

NgFormModel.prototype.ngOnChanges = function (changes) { 
    if (collection_1.StringMapWrapper.contains(changes, "form")) { 
     var sync = shared_1.composeValidators(this._validators); 
     this.form.validator = validators_1.Validators.compose([this.form.validator, sync]); 
     var async = shared_1.composeAsyncValidators(this._asyncValidators); 
     this.form.asyncValidator = validators_1.Validators.composeAsync([this.form.asyncValidator, async]); 
     this.form.updateValueAndValidity({ onlySelf: true, emitEvent: false }); 
    } 
    this._updateDomValue(); 
}; 

wobei 'this.form' null ist.

Kann jemand dieses Licht beleuchten? Ich habe mein Wissen über Angular 2 auf der Suche nach einer Lösung erschöpft!

Danke.

Antwort

11

Instanziieren Sie die innerhalb des signinForm Objekts in der SigninComponent Komponente, da Sie die ngFormModel Richtlinie nutzen. So etwas (zum Beispiel):

constructor(_builder:FormBuilder) { 
    this.signinForm = _builder.group({ 
     login: ['', Validators.required], 
     password: ['', Validators.required] 
}); 

Hoffe, es hilft Ihnen, Thierry

+0

Ich habe ursprünglich, aber der Fehler aufgetreten ist nach wie vor. Der Code, den ich gepostet habe, ist die Minimalversion. Ich werde versuchen, das signinForm instanziieren und sehen, ob das etwas ändert. – serlingpa

+0

Ich habe buchstäblich keine Ahnung warum, aber ich ging zurück und fügte die Felder hinzu, wie Sie vorgeschlagen haben und jetzt funktioniert es. Ich habe in Git verglichen, um zu sehen, was die Unterschiede sind, aber ich kann keine sehen! Macht nichts, ich werde nicht weiter nachforschen. Danke für Ihre Hilfe. – serlingpa

+0

Es funktioniert für mich, sobald ich es im Konstruktor anstatt nach einer Anfrage deklariere, vielen Dank – ConorJohn

Verwandte Themen