使用 Angular 2 Material 2 Alpha 5 和 Angular 2 RC 2

Using Angular 2 Material 2 Alpha 5 with Angular 2 RC 2

几天前,我开始探索最近发布的 Angular 2 RC 2,并尝试将我的应用程序从 Angular 2 RC 1 迁移到 Angular 1 RC 2。

我在我的应用程序中使用 Angular 2 Material 2 Alpha 5。

虽然迁移没有花费太多时间,但当我编译和 运行 应用程序时,我发现使用 Angular 2 material 2 个组件的表单已损坏。

material 表单控件不适用于 Angular 2 RC 2,并且控制台显示以下错误:

EXCEPTION: No value accessor for 'firstName'.

我在 md-inputmd-slide-togglemd-checkbox 上测试了它,我在所有这些上都收到了以下异常。

EXCEPTION: No value accessor for 'Field name'.

我假设您已成功将表单迁移到 Angular 2 RC 2.

如果您要将 Angular 2 RC 1(或更早版本)表单迁移到 Angular 2 RC 2 您可能会发现这对新表格很有帮助

要使 angular material 正常工作,您需要进行以下更改:

替换

var common_1 = require('@angular/common');

var common_1 = require('@angular/forms');

在以下文件中:

node_modules/@angular2-material/checkbox/checkbox.js
node_modules/@angular2-material/input/input.js
node_modules/@angular2-material/radio/radio.js
node_modules/@angular2-material/slide-toggle/slide-toggle.js

虽然在 material 组件源文件中进行上述更改适用于其他组件,但不适用于复选框。此更改确实消除了表单加载时的 ValueAccessor 错误,但是当提交表单时,如果选中复选框,它会在对象下方发布:

myCheckbox: MdCheckboxChange
checked:true
source:MdCheckbox
__proto__:Object
constructor:MdCheckboxChange()
__proto__:Object

为了解决这个问题,我们需要对以下文件进行另一项更改:

node_modules/@angular2-material/checkbox/checkbox.js

定位

MdCheckbox.prototype.registerOnChange = function (fn) {
    if (this._changeSubscription) {
        this._changeSubscription.unsubscribe();
    }
    this._changeSubscription = this.change.subscribe(fn);
};

并将其替换为以下内容:

MdCheckbox.prototype.registerOnChange = function (fn) {
        if (this._changeSubscription) {
            this._changeSubscription.unsubscribe();
        }
        this._changeSubscription = this.change
        .map(function (v) {
            return v.checked;
        })
        .subscribe(fn);
    };

希望以上内容对您有用。

不要忘记在 main.ts(或 js)

中添加对 bootstrap 代码的 "provideForms" 调用

我的 bootstrap 代码看起来像

return bootstrap(<Type>AppComponent, [
    ...PROVIDERS,
    ...ENV_PROVIDERS,
    ...DIRECTIVES,
    ...PIPES,
    ...APP_PROVIDERS,
    ...APP_ROUTER_PROVIDERS,
    disableDeprecatedForms(),
    provideForms()
])