当引用可以隐藏/"销毁"的输入时(因为使用了*ngIf并且某些元素被销毁),由angular2语法#(在下面的示例中为#test)创建的局部变量不起作用,即使元素存在于页面中.
代码是:
@Component({
selector: 'my-app',
template: `<h1>My First Angular 2 App</h1>
<button (click)="focusOther(test)">test</button>
<input #test *ngIf="boolValue" >
`
})
export class AppComponent {
private isVisible = false;
focusOther(testElement){
this.isVisible = true;
alert(testElement);
testElement.focus();
}
}
Run Code Online (Sandbox Code Playgroud)
警报显示"未定义",因为没有任何内容传递给该函数.
是否有解决方案使其工作?我的目标是集中一个将要创建的元素.
Mark Rajcok给出的解决方案:使用一个使用elementRef并在元素上调用.focus()的afterViewInit创建一个指令.
有关第1部分的工作版本,请参阅此plunker:http://plnkr.co/edit/JmBBHMo1hXLe4jrbpVdv?p = preview
一旦修复了"创建后焦点"的问题,我需要一种重新聚焦()组件的方法,比如"test.focus()"(其中#test是输入的局部变量名,但不能像我之前演示的那样使用).
Mark Rajcok提供的多种解决方案
我想从requirejs迁移到SystemJS但是我没有找到解决方案,因为requirejs有模块版本控制.例如在生产(ASP.Net网站)中我设置了RequireJS,如下所示:
require.config({
baseUrl: "@Url.Content("~/Scripts/")",
urlArgs: "buildNumber=@(File.GetLastWriteTime(ViewContext.Controller.GetType().Assembly.Location).ToBinary().ToString() + typeof(Foundation.MvcApplication).Assembly.GetName().Version)",
...
});
Run Code Online (Sandbox Code Playgroud)
它保证在生产环境中重新发布项目后重新加载文件,并保持这种方式直到重新加载.
但是,我没有为SystemJS找到任何解决方案(因为SystemJS管理更多类型的模块,我想迁移到它).
有没有人在生产中使用SystemJS并遇到同样的问题,你知道SystemJS中的"urlArgs"参数(或插件)吗?
一种方法是标准的异步方法,如下所示:
private static async Task AutoRetryHandlerAsync_Worker(Func<Task<bool>> taskToRun,...)
Run Code Online (Sandbox Code Playgroud)
我测试了两个实现,一个使用await,另一个使用.Wait()
这两个实现完全不相同,因为相同的测试失败了await版本而不是Wait()版本.
此方法的目标是"执行输入函数返回的任务,并通过执行相同的函数重试直到它工作"(如果达到一定次数的尝试,则自动停止的限制).
这有效:
private static async Task AutoRetryHandlerAsync_Worker(Func<Task<bool>> taskToRun,...)
{
try {
await taskToRun();
}
catch(Exception)
{
// Execute later, and wait the result to complete
await Task.Delay(currentDelayMs).ContinueWith(t =>
{
// Wait for the recursive call to complete
AutoRetryHandlerAsync_Worker(taskToRun).Wait();
});
// Stop
return;
}
}
Run Code Online (Sandbox Code Playgroud)
而且(async t =>
使用await
而不是使用t =>
和使用.Wait()
根本不起作用,因为在return;
执行final之前不会等待递归调用的结果:
private static async Task AutoRetryHandlerAsync_Worker(Func<Task<bool>> taskToRun,...) …
Run Code Online (Sandbox Code Playgroud) 我正在使用该示例使用nodejs和expressjs设置Angular 4 Universal:https: //github.com/FrozenPandaz/ng-universal-demo
我一直在尝试将数据从第一个完整页面加载传递到Angular 4 final应用程序.
用例是传输从标题中检测到的语言,以便从Angular 4服务器渲染器中吸收它,以便它可以使用正确的语言来翻译事物.
到目前为止,我发现的唯一方法是使用来自"/"路由的expressjs的HTTP头进行语言检测,并使用HTTP 302重定向到"/ fr",例如,如果用户语言是法语.
main.server.ts
app.param('language', function(req: any, res, next, language) {
if(language.length == 2)
{
req.language = language;
next();
} else {
next(new Error('Invalid language found'));
}
});
// Redirect incoming trafic without language in url (302 used so the browser do not seal that redirection if the user decides to change language and reload)
app.get('/', function(req, res) {
res.set('location', baseUrl + '/' + getLanguage(req);
res.status(302).send();
}); …
Run Code Online (Sandbox Code Playgroud) 我已经使用Angular项目模板https://docs.microsoft.com/zh-CN/aspnet/core/client-side/spa/angular?view=aspnetcore-2.1&tabs=visual-创建了ASP.NET Core应用程序工作室
在IIS上部署时,基本href为 <base href="/">
生成的dist / index.html中的脚本路径为:
<script type="text/javascript" src="runtime.js"></script>
<script type="text/javascript" src="polyfills.js"></script>
<script type="text/javascript" src="vendor.js"></script>
<script type="text/javascript" src="main.js"></script>
Run Code Online (Sandbox Code Playgroud)
ClientApp/dist
由于以下代码,ASP.NET Core项目应注意这些文件位于目录中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
// In production, the Angular files will be served from this directory
services.AddSpaStaticFiles(configuration =>
{
configuration.RootPath = "ClientApp/dist";
});
}
Run Code Online (Sandbox Code Playgroud)
该项目在IIS上运行,我们可以看到index.html的后台初始化消息正确显示,但是,如图所示,所有资源都加载在服务器的根目录“ /”上,因此它们得到404。
如果我尝试加载http:// {SERVERIP} / {PROJECTNAMEHERE} /runtime.js,我会看到它可以正常工作,所以我想这可能只是base href的问题。
如何从ASP.NET Core动态设置该基本href?
我想知道它们是否是任何类型的最大深度选项或类似"仅获得第一个结果然后返回它"的功能但是它似乎在jQuery中不可用,因为甚至:首先在选择器中似乎没有更快致电.eq(0)感谢您的所有评论.
我想知道像"最近"这样的函数是否可用于子元素.
假设我有一个像这样的html结构:
div.container> [*一些元素,我不能使用children()]> div.sub1> div.sub2> div.sub1> [其他各种子元素]
如果我想要第一个div.sub1我做的事情如下:
$("div.container").find("div.sub1").eq(0)
Run Code Online (Sandbox Code Playgroud)
问题是我们无法指定"最大深度",因此将在所有孩子中搜索它.我认为这是一个性能问题.
我正在谈论"最大深度",因为我可以列出可能的选择器案例,但它将是一个很长的列表,大约6-10个项目,具体取决于具体情况.
有人有解决方案吗?
谢谢
我试图用CSS获得一个类似血统的视图.
问题是:在网络上我们有家庭树的资源(父母 - >孩子),但不适用于血统(孩子 - >父母)
有用的链接,但对于家谱:
我有这个脚本工作 http://thecodeplayer.com/walkthrough/css3-family-tree
但是我需要完全反转它(我的主节点需要在底部)并且我没有尝试解决方案.
G FATHER
FATHER
G MOTHER
CHILD
MOTHER
Run Code Online (Sandbox Code Playgroud)
(我也可以接受这样的解决方案:孩子可以位于底部,而其父母位于顶部)
但是如果可能的话,我希望用干净的HTML和CSS来完成它.
我正在使用简单的UL容器和A容器来获取信息.这意味着:
<ul>
<li>
<a>Child</a>
<ul>
<li>
<a>Father</a>
...other ULs if available...
</li>
<li>
<a>Mother</a>
...other ULs if available...
</li>
</ul>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
我尝试了几种情况,一种是浮子,另一种是绝对定位,但我没有得到我想要的结果.
我不得不小提示:
http://jsfiddle.net/darknessm0404/bZGFA/
和旧版本:
http://jsfiddle.net/darknessm0404/4SDNm/
如果您有任何建议或解决方案,请告诉我.网上有很好的CSS家谱,但我不想要它们,因为它们与我想要的相反.
我在我的一个项目中使用了http://phpexcel.codeplex.com,我遇到了一个问题.我想在单元格中写入time()值,我正在这样做:
function writeTimeLine($objActiveSheet, &$lineNumber, $timeStart, $timeEnd, $duration, $category, $client, $date, $comment)
{
$objActiveSheet->setCellValue('A'.$lineNumber, PHPExcel_Shared_Date::PHPToExcel( $timeStart ));
$objActiveSheet->getStyle('A'.$lineNumber)->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_DATE_TIME4);
}
Run Code Online (Sandbox Code Playgroud)
$ objActiveSheet引用$ objPHPExcel-> getActiveSheet()
Excel中的结果是:
20点27分39秒
当我在电脑上实际测试时,它是16:27:39
所以这是时区的问题(我住在东美洲,这是-4).但是,我在设置默认时区后包含PHPExcel文件
date_default_timezone_set('America/New_York');
Run Code Online (Sandbox Code Playgroud)
即使有时间的回声()我也看到了正确的小时(16:27:39).
这是PHPExcel的错误还是我在这里做错了什么?
谢谢你的帮助.
我不知道Subject对象如何用于我想在Angular2中实现的Suggestion/Search服务.
假设每次输入更改时都会调用generateSuggestions ,以供自动完成使用.
我不明白为什么我无法从"next()"调用中得到一些东西,typescript编译器说它返回了一个void类型.
我的目标是将每个更改提交给一个对象,该对象将决定在服务器上调用每个500毫秒的函数,而不会在每个密钥条目上发送垃圾邮件.
import { Jsonp, Response, Http } from 'angular2/http';
import * as Rx from 'rxjs/Rx';
import { Injectable } from 'angular2/core';
@Injectable()
export class SearchService {
queryStream = new Rx.Subject();
constructor(public http: Http) {
}
generateSuggestions(query: string) {
this.queryStream
.next(query)
.debounce(500) // Compiler error: Debounce does not exist on type "void"
.map(
query => this.http.get('hellow')
.map( (res: Response) => res.json() )
.subscribe( results => console.log(results) )
);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以在普通的JS/Typescript中做到这一点,但我真的想尝试使用RxJ,因为它已经被Angular2使用了.
这里犯了什么错误?在他们的官方网站上没有任何示例的文档真的很差.
经过几年的 Node.js 编程,我已经习惯了 JS,我想知道如何避免C# 中的while循环,通过使用更“类似地图”的方法(如 C# 中的 AddRange)来添加数组中的项目可枚举)。
例如,如果我想要一个 JavaScript 中包含 10 个元素的数组,每个元素都有一个每次递增的属性,我会这样做:
const cells = Array.from({ length:10 }, (_, i) => { 'number': i });
// gives cells = [{number: 0}, {number: 1}, ... until 9]
Run Code Online (Sandbox Code Playgroud)
如何在没有while
orfor
循环的 C# 中做到这一点?
int itemWantedCount = 10;
int i = 0;
while(cells.Count < itemWantedCount)
{
cells.Add(new MyObject(i++));
}
Run Code Online (Sandbox Code Playgroud)
我想找到一种使用 cells.AddRange 的方法,而不使用 for/while ,如果可能的话。