几天前,我开始探索最近发布的角2rc 2,并尝试将我的应用程序从角2rc 1迁移到角1rc 2。
我在我的应用程序中使用了角2材料2阿尔法5。
虽然迁移并不花费太多时间,但当我编译和运行这个应用程序时,我发现使用角2材料2组件的表单被破坏了。
材质窗体控件不适用于角2 RC 2,控制台显示以下错误:
EXCEPTION: No value accessor for 'firstName'.
我在md-input
、md-slide-toggle
和md-checkbox
上测试了它,在它们中我得到了下面的例外。
EXCEPTION: No value accessor for 'Field name'.
发布于 2016-06-24 22:52:22
我假设您已经成功地将表单迁移到了角2rc 2。
如果您正在将角2 RC 1(或更早的)窗体迁移到角2 RC 2,您可能会发现这对新窗体很有帮助。
How to migrate Angular 2 RC 1 (or earlier) Forms to Angular 2 RC 2 / RC 4 New Forms
要使角质材料工作,您需要进行以下更改:
取代
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
尽管上面对材料组件进行了更改,源文件对其他组件有效,但不适用于复选框。此更改确实删除了表单加载时的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);
};
我希望你会发现上面的有用。
发布于 2016-07-29 08:59:54
不要忘记将"provideForms“调用添加到main.ts (或js)中的引导代码中。
我的引导代码看起来像
return bootstrap(<Type>AppComponent, [
...PROVIDERS,
...ENV_PROVIDERS,
...DIRECTIVES,
...PIPES,
...APP_PROVIDERS,
...APP_ROUTER_PROVIDERS,
disableDeprecatedForms(),
provideForms()
])
https://stackoverflow.com/questions/38023104
复制相似问题