我在该组件中有一个Angular2组件,它当前有一些字段,在它们之前应用@Input()以允许绑定到该属性,即
@Input() allowDay: boolean;
Run Code Online (Sandbox Code Playgroud)
我想要做的是实际使用get/set绑定到一个属性,这样我就可以在setter中做一些其他的逻辑,如下所示
_allowDay: boolean;
get allowDay(): boolean {
return this._allowDay;
}
set allowDay(value: boolean) {
this._allowDay = value;
this.updatePeriodTypes();
}
Run Code Online (Sandbox Code Playgroud)
我如何在Angular2中做到这一点?
根据Thierry Templier的建议我将其更改为,但是抛出错误无法绑定到'allowDay',因为它不是已知的本机属性:
//@Input() allowDay: boolean;
_allowDay: boolean;
get allowDay(): boolean {
return this._allowDay;
}
@Input('allowDay') set allowDay(value: boolean) {
this._allowDay = value;
this.updatePeriodTypes();
}
Run Code Online (Sandbox Code Playgroud) 我有一个名为sortColumn的变量,它包含我想要对查询结果进行排序的列的文本.我还有一个通用存储库,它将包含我想要排序的字段的Expression作为参数.我似乎无法从字符串属性名称获取到Expression.
所以我拥有的通用存储库包含以下方法
public IEnumerable<TEntity> Get<TOrderBy>(Expression<Func<TEntity, bool>> criteria,
Expression<Func<TEntity, TOrderBy>> orderBy, int pageIndex,
int pageSize,
bool isAssendingOrder = true,
EnumDeletePolicy deletePolicy = EnumDeletePolicy.ExcludeDeleted)
Run Code Online (Sandbox Code Playgroud)
注意这个Get的第二个参数是Expression-Func-TEntity,TOrderBy.正如我所提到的,我有一个名为sortColumn的变量,它包含我的TEntity对象上属性的字符串,我需要将此字符串转换为可以传递给Get方法的Expression.
这就是我现在所拥有的.
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var lambdaExpression = Expression.Lambda(memberExpression, parameter);
Run Code Online (Sandbox Code Playgroud)
这将创建LambdaExpression类型的对象.此LambdaExpression的实际类型是Expression-Func-IContract,字符串(或属性的sortColumn类型).如果我调用Get方法并传入此LambdaExpression并将其显式转换为Expression类型,那么它将正常工作.问题是我不知道Expression类型是什么,它可能是一个字符串,int,int?等等.这完全取决于sortColumn属性中特定属性的类型.
你能帮我把最后一次跳转到正确的Expression类型吗?
根据Marc的建议编辑:我几乎有这个工作,实际上基于它正在工作的问题,但我有1个剩余的问题.
作为我要查询的实体类型的IContract实际上是从IRelationship继承的.如果我从IContract接口指定一个字段,那么上面的代码可以工作.如果我从IRelationship接口指定一个字段,则以下行失败.
var memberExpression = Expression.Property(parameter, data.SortColumn);
Run Code Online (Sandbox Code Playgroud)
如果我尝试下面这样的东西,以便我从IRelationship中获取MemberExpression,但是基于IContract构建Lambda,我从存储库中收到错误.
var parameter = Expression.Parameter(typeof(IRelationship));
var memberExpression = Expression.Property(parameter, data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, Expression.Parameter(typeof(IContract)));
Run Code Online (Sandbox Code Playgroud)
我得到的错误是"参数''未绑定在指定的LINQ to Entities查询表达式中."
让它运作的最终表达是这样的
var parameter = Expression.Parameter(typeof(IContract));
var memberExpression = Expression.Property(parameter, typeof(IRelationship), data.SortColumn);
var orderBy = Expression.Lambda(memberExpression, …Run Code Online (Sandbox Code Playgroud) 我有一个ASP.NET应用程序,它提供了一个上传文件(图像)的简单表单.看起来像这样:
public IActionResult Process()
{
return View();
}
[HttpPost]
public IActionResult Process(List<IFormFile> files)
{
var telemetry = new TelemetryClient();
try
{
var result = files.Count + " file(s) processed " + Environment.NewLine;
foreach (var file in files)
{
result += file.FileName + Environment.NewLine;
var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
var binaryReader = new BinaryReader(memoryStream);
var bytes = binaryReader.ReadBytes((int)memoryStream.Length);
var imageInformation = ImageService.ProcessImage(bytes);
ImageService.SaveImage(imageInformation.Result, bytes, file.FileName.Substring(file.FileName.LastIndexOf(".", StringComparison.Ordinal) + 1));
}
return View((object)result);
}
catch (Exception ex)
{
telemetry.TrackException(ex);
throw; …Run Code Online (Sandbox Code Playgroud) 有人可以向我提供一个示例,说明如何在TypeScript中使用依赖注入创建角度过滤器.在底部是我目前所拥有的,它工作正常,但我想要做的是我想要访问$ filter的函数,以便我可以将行返回date.ToString()更改为$ filter '日期'.这样我使用内置日期过滤器来显示一个友好的短期约会.
class FriendlyDateFilter {
public static Factory() {
return function (input): string {
if (angular.isDate(input)) {
var date: Date = input;
var today = new Date();
var days = Math.abs(getDaysBetweenDates(today, date));
if (days < 7) {
var dayInWeek = date.getDay();
switch (dayInWeek) {
case 0:
return "Sunday";
break;
case 1:
return "Monday";
break;
case 2:
return "Tuesday";
break;
case 3:
return "Wednesday";
break;
case 4:
return "Thursday";
break;
case 5:
return "Friday";
break;
case 6:
return "Saturday"; …Run Code Online (Sandbox Code Playgroud) 我有在C#控制器我的ASP.NET核心应用设置应用程序见解,它是记录基本数据,如网页浏览,响应时间等,但我想创造一些自定义的事件和日志的一样好,但我不能让任何他的自定义事件将显示在Azure门户中.目前我正在使用免费版的Application Insights.
非常直截了当
var appInsights = new TelemetryClient();
appInsights.TrackEvent(eventName, properties);
Run Code Online (Sandbox Code Playgroud)
eventName是一个字符串,包含我想要跟踪的自定义事件,属性是一个字典来跟踪一些其他属性.
我运行应用程序并点击那些线了几次后,我就可以去蔚蓝的门户网站,看到的基本信息,但是当我做一个搜索它说,有0自定义事件,并通过搜索任何自定义事件name不返回任何结果.
我有一个类,下面有遥测器的东西
public class ApplicationInsightsTracker : IApplicationTracker
{
private readonly TelemetryClient AppInsights = new TelemetryClient();
public void TrackEvent(string eventName, string userName, Dictionary<string, string> properties = null)
{
AppInsights.Context.User.AccountId = userName;
TrackEvent(eventName, properties);
}
public void TrackRequest(string eventName, string userName, TimeSpan elapsed,
Dictionary<string, string> properties = null)
{
AppInsights.Context.User.AccountId = userName;
TrackEvent(eventName, properties);
AppInsights.TrackRequest(eventName, DateTimeOffset.Now, elapsed, "200", true);
AppInsights.Flush();
}
private void TrackEvent(string eventName, IDictionary<string, string> properties = null)
{ …Run Code Online (Sandbox Code Playgroud) 我有一个像这样定义的 PrimeNG 下拉菜单
<p-dropdown id="businessType" name="businessType" required placeholder="select one"
[style]="{'width': '100%'}" [styleClass]="hasError(ideaInitiatedForm?.controls?.businessType)"
[options]="businessTypes" [(ngModel)]="stage.BusinessType"></p-dropdown>
Run Code Online (Sandbox Code Playgroud)
为此的组件定义如下
export class IdeaInitiatedComponent implements OnInit {
businessTypes: SelectItem[] = [];
ngOnInit(): void {
this.loadReferenceList(this.businessTypesService.get, this.businessTypesService, this.businessTypes);
}
loadReferenceList(loadMethod: () => Observable<string[]|Points[]>, service: any, lookupList: SelectItem[]): any {
const method = loadMethod.bind(service);
method()
.subscribe(((items: string[] | Points[]) => {
_.each(items,
(item: string|Points) => {
const label = item.hasOwnProperty('description') ? (item as Points).description : item as string;
const value = item.hasOwnProperty('points') ? (item as Points).points.toString() : item …Run Code Online (Sandbox Code Playgroud) 我有一个从敏捷过程继承的过程。基本过程具有以下状态:新建,活动,已解决,已完成。我添加了几个新状态,因此现在进行了“新”,“已分类”,“活动”,“未开发”,“已完成IT测试”,“已解决”,“已确认”,“已完成”,以更好地匹配流经不同人员的方式。
该流程具有一些内置的状态更改规则,因此从“新建”到“已解决”或从“活动”到“已解决”时,“分配给”更改将返回到“创建者”。同样,当它从“已解决”返回到“活动”时,会将分配的切换回“已解决者”用户。这很好用,我的问题是这些状态更改规则仅针对这些特定状态发生。
在VSTS在线中,我设置了一些自定义规则,以在不同状态之间移动时做不同的事情,但是我找不到解决方法,就是将“分配给”字段设置为“工作项”上的其他人字段。我可以将其设置为硬编码的人,但这不是我想要的。我想对新状态上的内置状态执行相同的状态更改规则。
我有一个ASP.NET Core 2.0应用程序设置,我想使用AzureAd进行我公司目录的身份验证.我已经设置了类和启动方法并使身份验证工作正常,我遇到的问题是我正在尝试设置OnAuthorizationCodeReceived事件的事件处理程序,以便我可以请求一个用户令牌用于Microsoft图形调用.
在我的Startup.cs中,我有以下代码
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
sharedOptions.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie();
services.AddMvc();
services.AddSingleton(Configuration);
services.AddSingleton<IGraphAuthProvider, GraphAuthProvider>();
services.AddTransient<IGraphSDKHelper, GraphSDKHelper>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
} …Run Code Online (Sandbox Code Playgroud) 我试图找到在 Azure ComsmosDB SQL 查询中执行 If/Case 类型语句的正确语法。这是我拥有的文件
{
"CurrentStage": "Stage2",
"Stage1": {
"Title": "Stage 1"
},
"Stage2": {
"Title": "Stage 2"
},
"Stage3": {
"Title": "Stage 3"
}
Run Code Online (Sandbox Code Playgroud)
}
我想要做的是创建一个看起来像的查询
Select c.CurrentStage,
if (CurrentStage == 'Stage1') { c.Stage1.Title }
else if (CurrentStage == 'Stage2') { c.Stage2.Title }
else if (CurrentStage == 'Stage3') { c.Stage3.Title } as Title
From c
Run Code Online (Sandbox Code Playgroud)
显然,我拥有的文档和查询比这个复杂得多,但这让您对我正在尝试做的事情有了大致的了解。根据文档中的其他一些字段,我在选择中有 1 个字段是可变的。
今天,我有一个可以工作的方法,该方法返回基于字符串属性名称的lambda表达式,即我传入“ Description”,并且它返回d => d.Description的lambda。这很好用,但是现在我需要给定包含点符号的字符串,返回一个lambda表达式,即我想传递“ Customer.Name”并获得d => d.Customer.Name的lambda表达式。下面是我已经创建的返回1级lambda的方法,但是我不确定如何将其更改为多级。
protected dynamic CreateOrderByExpression(string sortColumn)
{
var type = typeof (TEntity);
Type entityType = null;
if (type.IsInterface)
{
var propertyInfos = new List<PropertyInfo>();
var considered = new List<Type>();
var queue = new Queue<Type>();
considered.Add(type);
queue.Enqueue(type);
while (queue.Count > 0)
{
var subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces().Where(subInterface => !considered.Contains(subInterface)))
{
considered.Add(subInterface);
queue.Enqueue(subInterface);
}
var typeProperties = subType.GetProperties(
BindingFlags.FlattenHierarchy
| BindingFlags.Public
| BindingFlags.Instance);
var newPropertyInfos = typeProperties
.Where(x => !propertyInfos.Contains(x));
propertyInfos.InsertRange(0, newPropertyInfos);
if …Run Code Online (Sandbox Code Playgroud) 我正在使用EntityFrameworkCore 1.0并尝试设置一些简单的单元测试,但仍然会出现错误,其结果是“已添加具有相同键的项。键:-10。我不知道如何防止我确实知道问题出在哪里,但不明白为什么以及如何解决。
首先,我有一个看起来像这样的测试:
public void CanLoadAllAnnouncements()
{
var service = new AnnouncementControllerService(GenerateTestData.Generate());
var results = service.Get();
Assert.Equal(3, results.Count);
Assert.Equal("Test Announcement 1", results[0].Message);
Assert.Equal("Test Announcement 2", results[1].Message);
Assert.Equal("Test Announcement 3", results[2].Message);
}
Run Code Online (Sandbox Code Playgroud)
您可以看到这正在调用正在生成的内存数据库中传递的控制器服务类。该类的代码看起来像这样。
public const string CurrentUserName = "testUserName";
public const string AlternateUserName = "anotherUserName";
public static DataContext Generate()
{
var context = new DataContext();
CreateRecentActivity(context);
CreateAnnouncement(context);
context.SaveChanges();
return context;
}
private static void CreateAnnouncement(DataContext context)
{
AddAnnouncement(context, -20, "Test Announcement 1", 1);
AddAnnouncement(context, -21, "Test Announcement 2", 2);
AddAnnouncement(context, -22, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Moq创建一组测试方法来覆盖外部依赖项。这些依赖项本质上是异步的,我遇到了一组依赖项,它们在等待时再也不会返回,因此我不确定我缺少什么。
测试本身非常简单。
[TestMethod]
public async Task UpdateItemAsync()
{
var repository = GetRepository();
var result = await repository.UpdateItemAsync("", new object());
Assert.IsNotNull(result);
}
Run Code Online (Sandbox Code Playgroud)
GetRepository上面的方法是设置各种模拟对象的方法,包括在其上调用Setup的方法。
private static DocumentDbRepository<object> GetRepository()
{
var client = new Mock<IDocumentClient>();
var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build();
client.Setup(m => m.ReplaceDocumentAsync(It.IsAny<Uri>(), It.IsAny<object>(), It.IsAny<RequestOptions>()))
.Returns(() =>
{
return new Task<ResourceResponse<Document>>(() => new ResourceResponse<Document>());
});
var repository = new DocumentDbRepository<object>(configuration, client.Object);
return repository;
}
Run Code Online (Sandbox Code Playgroud)
下面列出了要测试的代码,执行带有await的行时,它永远不会返回。
public async Task<T> UpdateItemAsync(string id, T item)
{
var result = await Client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item);
return …Run Code Online (Sandbox Code Playgroud) 我在 Azure 数据工厂中有一个管道设置,它有一个名为 MonthsBack 的管道变量设置,默认为 12。在Until 循环中,我构建了一个SQL 语句,该语句使用此MonthsBack 变量来生成SQL 语句,并且在循环中它还将值减1,并将这些SQL 语句附加到另一个集合变量中。在Until 块运行后,我有一个包含12 个SQL 语句的数组,然后在ForEach 块中使用它来执行这12 个语句并动态生成12 个存储在数据湖中的文件。这一切都很好,并且完全符合我的要求。
现在我有一个新的需求,而不是有 12 个 SQL 语句,我想要做的是将 MonthsBack 变量设置为等于 SQL 数据库中的某个值,所以理想情况下我会创建一个新的 DataSet 来查询和检索它值,然后使用它来设置 MonthsBack 数据库的默认值。我似乎无法弄清楚如何使用给定的任务完成此任务。
我知道我在“动态内容”窗格中看到了一种引用先前任务结果的方法,但我不记得我之前是如何做到这一点的。有人可以告诉我或指向我有关如何执行此操作的正确文档。谢谢
c# ×7
angular ×2
asp.net ×2
unit-testing ×2
angularjs ×1
asp.net-core ×1
asp.net-mvc ×1
async-await ×1
azure ×1
azure-devops ×1
dynamic ×1
expression ×1
filter ×1
generics ×1
lambda ×1
moq ×1
primeng ×1
sharepoint ×1
tfs-workitem ×1
typescript ×1