角度材质对话框问题 - 无法让它打开对话框?

时间:2018-02-13 14:59:42

标签: html angular angular-material

任何人都可以通过点击按钮来尝试打开此对话框吗?我已经有3个不同的对话框可以完美地工作,但我无法弄清楚我做错了什么......

我确保在app.module.ts中包含/// <summary> /// Customised controller for intercepting traffic for the DB Odata feeds. /// Any route that is not prefixed with ~/DB/ will not be intercepted or processed via this controller /// <remarks>Will instead be directed to the base class</remarks> /// </summary> public class DBODataHttpControllerSelector : DefaultHttpControllerSelector { private readonly HttpConfiguration _configuration; public DBODataHttpControllerSelector(HttpConfiguration config) : base(config) { _configuration = config; } // From: http://www.codeproject.com/Articles/741326/Introduction-to-Web-API-Versioning private Dictionary<string, HttpControllerDescriptor> _controllerMap = null; private List<string> _duplicates = new List<string>(); /// <summary> /// Because we are interested in supporting nested namespaces similar to MVC "Area"s we need to /// Index our available controller classes by the potential url segments that might be passed in /// </summary> /// <returns></returns> private Dictionary<string, HttpControllerDescriptor> InitializeControllerDictionary() { if(_controllerMap != null) return _controllerMap; _controllerMap = new Dictionary<string, HttpControllerDescriptor>(StringComparer.OrdinalIgnoreCase); // Create a lookup table where key is "namespace.controller". The value of "namespace" is the last // segment of the full namespace. For example: // MyApplication.Controllers.V1.ProductsController => "V1.Products" IAssembliesResolver assembliesResolver = _configuration.Services.GetAssembliesResolver(); IHttpControllerTypeResolver controllersResolver = _configuration.Services.GetHttpControllerTypeResolver(); ICollection<Type> controllerTypes = controllersResolver.GetControllerTypes(assembliesResolver); foreach (Type t in controllerTypes) { var segments = t.Namespace.Split(Type.Delimiter); // For the dictionary key, strip "Controller" from the end of the type name. // This matches the behavior of DefaultHttpControllerSelector. var controllerName = t.Name.Remove(t.Name.Length - DefaultHttpControllerSelector.ControllerSuffix.Length); var key = String.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}", segments[segments.Length - 2], segments[segments.Length - 1], controllerName); // Check for duplicate keys. if (_controllerMap.Keys.Contains(key)) { _duplicates.Add(key); } else { _controllerMap[key] = new HttpControllerDescriptor(_configuration, t.Name, t); } } // Remove any duplicates from the dictionary, because these create ambiguous matches. // For example, "Foo.V1.ProductsController" and "Bar.V1.ProductsController" both map to "v1.products". // CS: Ahem... thats why I've opted to go 3 levels of depth to key name, but this still applies if the duplicates are there again foreach (string s in _duplicates) { _controllerMap.Remove(s); } return _controllerMap; } /// <summary> /// Because we are interested in supporting nested namespaces we want the full route /// to match to the full namespace (or at least the right part of it) /// </summary> /// <returns></returns> private Dictionary<string, HttpControllerDescriptor> _fullControllerMap = null; private Dictionary<string, HttpControllerDescriptor> InitializeFullControllerDictionary() { if(_fullControllerMap != null) return _fullControllerMap; _fullControllerMap = new Dictionary<string, HttpControllerDescriptor>(StringComparer.OrdinalIgnoreCase); // Create a lookup table where key is "namespace.controller". The value of "namespace" is the last // segment of the full namespace. For example: // MyApplication.Controllers.V1.ProductsController => "V1.Products" IAssembliesResolver assembliesResolver = _configuration.Services.GetAssembliesResolver(); IHttpControllerTypeResolver controllersResolver = _configuration.Services.GetHttpControllerTypeResolver(); ICollection<Type> controllerTypes = controllersResolver.GetControllerTypes(assembliesResolver); foreach (Type t in controllerTypes) { var segments = t.Namespace.Split(Type.Delimiter); // For the dictionary key, strip "Controller" from the end of the type name. // This matches the behavior of DefaultHttpControllerSelector. var controllerName = t.Name.Remove(t.Name.Length - DefaultHttpControllerSelector.ControllerSuffix.Length); var key = t.FullName;// t.Namespace + "." + controllerName; _fullControllerMap[key] = new HttpControllerDescriptor(_configuration, t.Name, t); } return _fullControllerMap; } /// <summary> /// Select the controllers with a simulated MVC area sort of functionality, but only for the ~/DB/ route /// </summary> /// <param name="request"></param> /// <returns></returns> public override System.Web.Http.Controllers.HttpControllerDescriptor SelectController(System.Net.Http.HttpRequestMessage request) { string rootPath = "db"; IHttpRouteData routeData = request.GetRouteData(); string[] uriSegments = request.RequestUri.LocalPath.Split('/'); if (uriSegments.First().ToLower() == rootPath || uriSegments[1].ToLower() == rootPath) { #region DB Route Selector // If we can find a known api and a controller, then redirect to the correct controller // Otherwise allow the standard select to work string[] knownApis = new string[] { "tms", "srg", "cumulus" }; // Get variables from the route data. /* support version like this: * config.Routes.MapODataRoute( routeName: "ODataDefault", routePrefix: "{version}/{area}/{controller}", model: model); object versionName = null; routeData.Values.TryGetValue("version", out versionName); object apiName = null; routeData.Values.TryGetValue("api", out apiName); object controllerName = null; routeData.Values.TryGetValue("controller", out controllerName); * */ // CS: we'll just use the local path AFTER the root path // db/tms/contact // db/srg/contact // Implicity parse this as // db/{api}/{controller} // so [0] = "" // so [1] = "api" // so [2] = "version" (optional) // so [2 or 3] = "controller" if (uriSegments.Length > 3) { string apiName = uriSegments[2]; if (knownApis.Contains(string.Format("{0}", apiName).ToLower())) { string version = ""; string controllerName = uriSegments[3]; if (controllerName.ToLower().StartsWith("v") // and the rest of the name is numeric && !controllerName.Skip(1).Any(c => !Char.IsNumber(c)) ) { version = controllerName; controllerName = uriSegments[4]; } // if the route has an OData item selector (#) then this needs to be trimmed from the end. if (controllerName.Contains('(')) controllerName = controllerName.Substring(0, controllerName.IndexOf('(')); string fullName = string.Format(CultureInfo.InvariantCulture, "{0}.{1}.{2}", apiName, version, controllerName).Replace("..", "."); // Search for the controller. // _controllerTypes is a list of HttpControllerDescriptors var descriptors = InitializeControllerDictionary().Where(t => t.Key.EndsWith(fullName, StringComparison.OrdinalIgnoreCase)).ToList(); if (descriptors.Any()) { var descriptor = descriptors.First().Value; if (descriptors.Count > 1) { descriptor = null; // Assume that the version was missing, and we have implemented versioning for that controller // If there is a row with no versioning, so no v1, v2... then use that // if all rows are versioned, use the highest version if (descriptors.Count(d => d.Key.Split('.').Length == 2) == 1) descriptor = descriptors.First(d => d.Key.Split('.').Length == 2).Value; else if (descriptors.Count(d => d.Key.Split('.').Length > 2) == descriptors.Count()) descriptor = descriptors .Where(d => d.Key.Split('.').Length > 2) .OrderByDescending(d => d.Key.Split('.')[1]) .First().Value; if (descriptor == null) throw new HttpResponseException( request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Multiple controllers were found that match this un-versioned request.")); } if (descriptor != null) return descriptor; } if (_duplicates.Any(d => d.ToLower() == fullName.ToLower())) throw new HttpResponseException( request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Multiple controllers were found that match this request.")); } } #endregion DB Route Selector } else { // match on class names that match the route. // So if the route is odata.tms.testController // Then the class name must also match // Add in an option to doing a string mapping, so that // route otms can mapp to odata.tms // TODO: add any other custom logic for selecting the controller that you want, alternatively try this style syntax in your route config: //routes.MapRoute( // name: "Default", // url: "{controller}/{action}/{id}", // defaults: new { controller = "Home", action = "RegisterNow", id = UrlParameter.Optional }, // namespaces: new[] { "YourCompany.Controllers" } //); // Because controller path mapping might be controller/navigationproperty/action // We need to check for the following matches: // controller.navigationproperty.actionController // controller.navigationpropertyController // controllerController string searchPath = string.Join(".", uriSegments).ToLower().Split('(')[0] + "controller"; var descriptors = InitializeFullControllerDictionary().Where(t => t.Key.ToLower().Contains(searchPath)).ToList(); if (descriptors.Any()) { var descriptor = descriptors.First().Value; if (descriptors.Count > 1) { descriptor = null; // In this mode, I think we should only ever have a single match, ready to prove me wrong? if (descriptor == null) throw new HttpResponseException( request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Multiple controllers were found that match this namespace request.")); } if (descriptor != null) return descriptor; } } return base.SelectController(request); } } 文件的导入以及其他导入到其他地方的其他地方...

3 个答案:

答案 0 :(得分:1)

您在模板中调用了openFullDetailDialog(r.number),但在组件中只有openFullDetailDialog()没有参数。

答案 1 :(得分:0)

由于您通过点击事件传递数据,您需要将MAT_DIALOG_DATA导入my-file.component.ts

答案 2 :(得分:0)

我发现我收到了控制台错误:

  

错误:找不到RaceDetailPopupComponent的组件工厂。你有没有把它添加到@ NgModule.entryComponents?

经过一段谷歌搜索后,我发现我需要将RaceDetailPopupComponent添加到entryComponents:[]部分下的'app.module.ts'文件中。

我的对话框现在可以正常打开。

NB。我不知道为什么会发生这种情况,因为我已经有两个从同一位置打开但具有不同输出的对话框...它们没有这个entryComponents导入。