我有一个组件,用于Angular Material MdDialog:
@Component({
...
})
export class MyComponent {
constructor(@Inject(MD_DIALOG_DATA) public data: any, public dialogRef:
MdDialogRef<MyComponent>) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
我试图用Jasmine进行单元测试:
describe('MyComponent', () => {
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
SharedTestingModule,
],
declarations: [
MyComponent,
],
})
.compileComponents();
}));
...
});
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到以下错误:
错误:没有InjectionToken MdDialogData的提供程序!
SharedTestingModule导入和导出我的自定义Angular Material模块,该模块本身导入并导出MdDialogModule.
我怎样才能摆脱这个错误?
非常感谢你!
Angular 4.2.4
Angular Material 2.0.0-beta.7
Jasmine 2.5.3
Run Code Online (Sandbox Code Playgroud) 我正在使用MdDialogModule来显示一个带有输入字段的Dialog窗口.Modal打开正常,我可以在输入字段中输入文本并提交,但是点击提交按钮,我希望输入表单中的数据返回到调用Dialog组件的主组件,并关闭对话框.
我该怎么做呢?我能够将数据传递给MdDialog组件,但没有找到任何关于如何从MdDialogComponent将数据返回到组件的资源.
我的Dialog组件代码如下所示
import { Component, OnInit, InjectionToken, Inject } from '@angular/core';
import { MD_DIALOG_DATA, MdDialogRef } from "@angular/material";
@Component({
selector: 'app-add-book',
templateUrl: './add-book.component.html',
styleUrls: ['./add-book.component.css']
})
export class AddBookComponent {
constructor() { }
}
Run Code Online (Sandbox Code Playgroud)
调用对话框的主要组件中的方法如下所示.现在没有返回任何响应,它返回Undefined,因为我还没有想出来.
openCreateDialog() {
let dialogRef = this.dialog.open(AddBookComponent)
.afterClosed()
.subscribe(response => {
console.log(response);
});
}
Run Code Online (Sandbox Code Playgroud) 我使用$mdDialog
推荐的方式使用Angular 1.5 Material Design controllerAs: "dialog"
.在模板中,我有一个表格:<form name="fooForm"
.在模板中,我可以毫无问题地访问表单,例如ng-disabled="fooForm.$invalid || fooForm.$submitted"
.
但是如何从$mdDialog
控制器中访问该表单?根据我的阅读,我希望能够做到这一点:
const doFoo = () => {
if (this.fooForm.$dirty) {
Run Code Online (Sandbox Code Playgroud)
这this
是对话框控制器.
但我得到一个错误:TypeError: Cannot read property '$dirty' of undefined
.果然,如果我在代码中放置断点,控制器就没有fooForm
属性.
我也尝试过使用$scope
,但是当我在代码中放置断点时$scope
也没有fooForm
属性.
这是我的对话框模板:
<md-dialog aria-label="FooBar">
<md-toolbar>
<div class="md-toolbar-tools">
<h2>FooBar</h2>
<span flex></span>
<md-button class="md-icon-button" ng-click="dialog.cancel()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<form name="fooForm" ng-submit="dialog.ok()" novalidate>
<md-dialog-content>
<div layout="column" layout-padding>
<h2 class="md-headline">Foo</h2>
<div layout="row" layout-xs="column">
...
</div> …
Run Code Online (Sandbox Code Playgroud) 我正在创建一个有角度的邮箱.当发送消息的弹出窗口关闭时,我需要保存草稿消息.
我知道有一些选择:
scope.$on("$destroy", function () { saveMessage() });
Run Code Online (Sandbox Code Playgroud)
和:
$mdDialog.show(...).finaly(function(){ saveMessage() });
Run Code Online (Sandbox Code Playgroud)
但两者都不足够:
所以我正在寻找在弹出窗口实际关闭之前调用函数的方法.就像是scope.$on("$mdDialogBeforeClose", function () { saveMessage() });
另一个选择是挂钩每个关闭事件.看起来很难看,但可能是解决方案.在这种情况下,我需要听取转义按钮并在弹出窗口外单击(Altough我可能会禁用该功能)...
有更好的想法吗?
谢谢!
编辑:
另外一个问题:如何捕获escape-keypress事件?我试过<md-dialog aria-label="List dialog" ng-keypress="keyPress($event)">
但它甚至没有被触发......
ondestroy angularjs oncloselistener angular-material mddialog
我试图使用配置传递一些属性值.但对话框无法全屏显示.
openTwigTemplate(): void {
let config = new MdDialogConfig();
config = {
position: {
top: '10px',
right: '10px'
},
height: '98%',
width: '100vw',
};
const dailog = this.dialog.open(TwigDialogComponent, config);
}
Run Code Online (Sandbox Code Playgroud)
如何根据分辨率打开对话框全屏?
我是css的新手,无法正确设置确认对话框的最大宽度.这是我调用对话框的代码:
this.$mdDialog.show({
content: longText,
ok: 'OK',
cancel: 'CANCEL'
clickOutsideToClose: true,
});
Run Code Online (Sandbox Code Playgroud)
问题是我longText
没有携带,我的对话框水平拉伸.我尝试在style.less
本地添加并确定max-width
如下:
.md-dialog {
max-width: 300px;
}
Run Code Online (Sandbox Code Playgroud)
但没有变化.有人可以帮助我吗?
目标:使用组件而不是使用$ scope来设置数据.没有要共享的错误,问题是对话框加载组件时未设置数据元素.屏幕截图显示了对话框的当前状态,应该在选项卡#2(信息)中绑定一个对象.在使用onComplete事件加载对话框后,我可以验证对象(文档)是否可用.我试图通过以下方式将对话框调用可用的数据绑定到组件:
locals: {
document: document
},
bindToController: true,
onComplete: function(){
console.log('document: %O', document);
}
Run Code Online (Sandbox Code Playgroud)
bindings: {
document: '='
}
Run Code Online (Sandbox Code Playgroud)
resolve: {
document: function() {
return document;
}
}
Run Code Online (Sandbox Code Playgroud)
我相信错误在这里,绑定,"旧方式"使用$ scope vars所以绑定毫不费力地连接.
(function(){
'use strict';
angular.module('adminClientApp')
.component('documentEdit', {
templateUrl: 'js/app/components/document/documentEdit/document-edit.html',
controller: function DocumentEditController($mdToast, $mdMedia) {
var var documentEdit = this;
documentEdit.document;
},
bindings: {
document: '<'
}
});
})();
Run Code Online (Sandbox Code Playgroud)
DialogController中只有$ mdDialog事件.我意识到locals和bindToController都是针对对话框中指定的控制器(DialogController).我在这里难过 - 如何设置/传递/连接文件到组件控制器?
this.showEdit = function ($event, document) {
var parentEl = angular.element(document.body);
$mdDialog.show({
parent: …
Run Code Online (Sandbox Code Playgroud) 我正在使用angular-1.5.8,d3-3.5.17,nvd3-1.8.5和angular-nvd3-1.0.9与Angular Material.我正在尝试将NVD3指令放入$mdDialog
.源代码很简单:
<md-dialog aria-label="FooBar">
<md-toolbar>
<div class="md-toolbar-tools">
<h2>FooBar/h2>
<span flex></span>
<md-button class="md-icon-button" ng-click="dialog.close()">
<md-icon>close</md-icon>
</md-button>
</div>
</md-toolbar>
<md-dialog-content>
<nvd3 options="dialog.options" data="dialog.data"></nvd3>
</md-dialog-content>
<md-dialog-actions>
<md-button ng-click="dialog.close()">
Close
</md-button>
</md-dialog-actions>
</md-dialog>
Run Code Online (Sandbox Code Playgroud)
我使用$mdDialog.show()
带fullscreen: true
.如你所知fullscreen: true
,如果浏览器窗口足够小,对话框只会全屏显示.
无论如何,我对类型图表有很多问题scatterChart
.这里有几个大的:
<md-dialog-content style="min-width=500px;min-height=300px">
只是一个例子,同样的事情发生:NVD3电荷水平扩展以填充宽度,但图表下方,关闭按钮上方有一个巨大的空白区域.如何让NVD3图表与mdDialog很好地配合,并填充整个对话框内容区域?
我正在尝试使用Angular 2中的对话框组件@angular/material2.0.0-beta.1
.我想要完成的是发送数据(这是人们从界面中选择的值,该对话框用于使人确认他们选择的值)到对话框并显示它.所以例如对话框应该这样说:
你选择了:
选项1:价值
选项2:价值
选项3:价值
取消| 确认
如何将这些值传递给我创建的对话框,以便我可以像查看模板中的{{value}}一样访问它们?我认为它使用数据配置,但我似乎无法找到关于如何使用它的好文档或示例.这是我一直在尝试的:
let config = new MdDialogConfig().data();
let dialogRef = this.dialog.open(DialogComponent);
Run Code Online (Sandbox Code Playgroud)
DialogComponent
import { Component } from '@angular/core';
import { MdDialogRef } from '@angular/material';
@Component({
selector: 'dialog',
template: require('./dialog.component.pug'),
styleUrls: [
'./dialog.component.scss'
]
})
export class DialogComponent {
constructor(public dialogRef: MdDialogRef<DialogComponent>) {}
}
Run Code Online (Sandbox Code Playgroud) 第一次用$ mdDialog工作我习惯用外部HTML模板创建一个对话框.
到目前为止,这么好,...它的工作模板可以打开,但在HTML中的ng-click不再工作.
我找不到它的原因.
在userController中调用mdDialog,如下所示:
<md-icon
layout="row"
flex md-font-set="material-icons"
class="active"
ng-click="vm.showMenu($event)">
menu
</md-icon>
Run Code Online (Sandbox Code Playgroud)
在userController中打开$ mdDialog的方法:
vm.showMenu = function showMenu(ev){
$mdDialog.show({
controller: MenuDialogController,
templateUrl: 'app/components/head/user/menu.dialog.html',
parent: angular.element($document.body),
targetEvent: ev,
clickOutsideToClose:true,
fullscreen: $scope.customFullscreen // Only for -xs, -sm breakpoints.
})
.then(function(answer) {
$scope.status = 'You said the information was "' + answer + '".';
}, function() {
$scope.status = 'You cancelled the dialog.';
});
};
Run Code Online (Sandbox Code Playgroud)
这是对话框的对话框控制器,按钮不起作用:
angular
.module('trax')
.controller('MenuDialogController', MenuDialogController);
function MenuDialogController() {
var vm = this;
vm.close = function close(){
alert('close …
Run Code Online (Sandbox Code Playgroud) javascript angularjs angularjs-ng-click angularjs-material mddialog