我知道我可以在grunt.config中设置一个任务,它将grunt-contrib-copy文件从src复制到dest,并查看Grunt文档,我知道我可以使用grunt.file.copy复制单个文件.
但是,是否可以在自定义注册任务中动态创建grunt-contrib-copy任务以适应从bash发送的参数?我想创建一个新目录grunt.file.mkdir("some/path/appfoldername"),然后将文件从另一个目标复制到该文件夹,但在运行自定义任务之前我不会知道文件夹名称.所以类似于:
grunt create_app:appfoldername
Run Code Online (Sandbox Code Playgroud)
所以我可以一次复制一个文件,但文件会改变,所以需要grunt-contrib-copy的强大功能,但具有自定义注册任务的灵活性.
如果我的解释不够清楚,我会想象这样的事情:
grunt.registerTask('createCopy', 'Create a copy', function(folderName) {
var cwd = grunt.template.process("some/path/to/app");
var src = grunt.template.process("some/path/to/src");
var dest = grunt.template.process("some/path/to/dest") + folderName;
grunt.task.run('copy: {
files: {
cwd: cwd,
src: src,
dest: dest
}
}');
}
Run Code Online (Sandbox Code Playgroud)
UPDATE
grunt.registerTask('mkapp', 'Create Application', function(appName) {
// Check appName is not empty or undefined
if(appName !== "" && appName !== undefined) {
// Require node path module, since not a global
var path = require("path");
// Resolve directory path using templates …Run Code Online (Sandbox Code Playgroud) 我正在使用一个非常简单的拦截器来检查响应拒绝403 Access Forbidden将用户重定向到登录,但它没有重定向.我可以将console.log直接放到$ location.path之前和之后的行,并且它永远不会发生.这事发生在别人身上过吗?我一直在盯着这个...原来我甚至不想使用$ location,但我不能注入ui.router而没有获得循环依赖,我也无法弄清楚如何摆脱这么多的位置应该让我感动,而我想到了.
.factory('AuthInterceptor', ['$q', '$location',
function( $q, $location ) {
var service = {
responseError: function( responseRejection ) {
// Authorization issue, access forbidden
if( responseRejection.status === 403 ) {
// TODO: show a login dialog, and/or redirect to login
console.log("Response rejected. Redirecting to login...");
$location.path('/login');
$location.replace();
console.log("Not so much with the redirecting... I'm still here");
}
// Propagate error to any chained promise handlers
return $q.reject( responseRejection );
}
}
return service;
}])
Run Code Online (Sandbox Code Playgroud) 我创建了Homestead的每个项目安装.我已经after.sh(在根目录中)包含RethinkDB之类的其他软件包没有问题,但是aliases文件(也在根目录中)虽然出现在VM中~~ .bash_aliases但是当我没有运行任何别名时m键入它们.例如这些别名:
alias artisan='php artisan'
alias autoload='composer dump-autoload'
Run Code Online (Sandbox Code Playgroud)
在命令提示符中:
artisan migrate:refresh --seed
autoload
Run Code Online (Sandbox Code Playgroud)
抛出这些错误:
Could not open input file: artisan
autoload: command not found
Run Code Online (Sandbox Code Playgroud)
对于我尝试的任何别名都会发生这种情况.我已经检查过使用nano存在〜/ .bash_aliases(或/home/vagrant/.bash_aliases),它绝对是别名的副本.只是没有任何命令被用作好像它不存在或者好像文件虽然在正确的位置是不可访问的.
谁知道为什么?或者如何解决这个问题?令人惊讶的是,如果不能使用我通常在本地使用的别名,或者在使用此VM时全局安装Homestead,这是多么令人讨厌.
UPDATE
我注意到command not found当我通过SSH连接到我所包含的别名数量时,我得到了一个错误列表.如果我跑,会出现相同的列表source ~/.bash_aliases.为了完全清晰.bash_aliases,位于/home/vagrant映射的源文件夹旁边,/home/vagrant/appSSHing到VM的输出以及相关的别名文件包括在内:
SSH进入VM
$ vagrant ssh
Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.19.0-25-generic x86_64)
* Documentation: https://help.ubuntu.com/
Last login: Mon Feb 15 00:37:39 2016 from 10.0.2.2
: command not found
: command not found
: command …Run Code Online (Sandbox Code Playgroud) 我不明白为什么当我更改输入中的绑定基元时,$ onChanges没有被启动.有人能看出我做错了什么,并以简单的方式解释这个问题吗?在我无法在实际应用程序中使用它之后,我做了一个快速测试应用程序的plunkr.
angular
.module('test', [])
.component('test', {
template: '<child application="vm.application"></child>',
controller: 'testCtrl as vm'
})
.controller('testCtrl', function() {
var vm = this;
vm.$onInit = function () {
vm.application = {
data: {
name: 'Test'
}
}
};
})
.component('child', {
template: '<input type="text" ng-model="vm.application.data.name">',
bindings: {
application: '<'
},
controller: 'childCtrl as vm'
})
.controller('childCtrl', function() {
var vm = this;
vm.$onChanges = function (changes) {
console.log('CHANGED: ', changes);
};
})
Run Code Online (Sandbox Code Playgroud) 我希望能够使用组件构建一个响应式表单,而不是将其全部设置在单个父组件中。所以我创建了初始FormGroup并将其传递给组件,然后this.form.addControl(this.fb.group({ ... }));将它们的组添加到表单中。
例子
父组件
this.form = this.fb.group({}); // Empty
public ngAfterViewInit() {
// Throws error after trying to patchValue on the child component
this.form.get('example').patchValue({
field1: 'Hello World!'
});
}
Run Code Online (Sandbox Code Playgroud)
子组件
this.parentFormGroup.addControl(
'childGroup',
this.fb.group({
field1: [
'', [Validators.required]
],
etc...
}
);
Run Code Online (Sandbox Code Playgroud)
这一直有效,直到我尝试并this.form.get('childGroup').patchValue({ ... })在ngAfterViewInit父组件的生命周期挂钩中发出请求之后。它没有修补组,而是抛出:
ERROR Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has
changed after it was checked. Previous value: 'ng-valid: false'. Current value:
'ng-valid: true'.
Run Code Online (Sandbox Code Playgroud)
有没有办法让子组件将自己添加到 a FormGroup,而不是让父组件设置FormGroup控件和验证。我们需要在应用程序中以不同的方式和组合重用子组件,因此不想FormGroup在子组件之外不断重复声明,但这似乎不起作用。
angular angular-reactive-forms angular5 angular-changedetection
将 Ionic 从 v5.0 更新到 v5.3.1(最新版本)以及适当提高 Capacitor、Ionic Native 和开发依赖项的版本的正确 npm 命令集是什么?
我在 Ionic 文档中找不到带有命令的更新指南,不像在 Angular 中,您可以按照https://update.angular.io上的更新步骤进行操作。它们似乎没有表明 CLI 版本是否应该与 Ionic 版本匹配,或者是否需要特定版本的 Ionic 或 CLI 的 Capacitor 版本,或者这些都不重要。
我会运行这些命令吗:
// dependencies
npm install @capacitor/android@latest
npm install @capacitor/core@latest
npm install @capacitor/ios@latest
npm install @ionic/core@latest
npm install @ionic-native/core@latest
npm install @ionic-native/in-app-browser@latest
npm install @ionic-native/splash-screen@latest
npm install @ionic-native/status-bar@latest
npm install @ionic/angular@latest
npm install @ionic/storage@latest
// dev dependencies
npm install @capacitor/cli@latest
npm install @ionic/angular-toolkit@latest
npm install @ionic/lab@latest
Run Code Online (Sandbox Code Playgroud)
或等效地只是运行npm upgrade <LIST_OF_ABOVE_PKGS>?Ionic、Ionic …
我正在对 NxWorkspace 及其在现有 .Net Core 解决方案中的实现进行快速测试,其中我们有多个可以从 NxWorkspace 中受益的 Angular 应用程序。我了解在创建一个没有 .Net Core API 的新存储库时这是如何工作的,但我很难想象将 NxWorkspace 实现到我们现有的存储库中。
\n我\xe2\x80\x99m 试图找出将 Nx 与 .Net Core(或非 JS 技术)结合使用时的最佳实践?Nx 是否必须位于根目录中,或者如果它位于下一层文件夹中是否会有影响?我\xe2\x80\x99已经完成了 NxWorkspace 视频讲座,因此我了解了 Nx 的实用性,但不知道如何将其应用于我们现有的存储库,或者是否应该与它的好处保持一致。例如:
\n前
\n根目录中的当前文件夹结构省略了 OpenShift、Docker 和管道工件:
\n/dotnet-webapi\n/client1-angular\n/client2-angular\n/client3-react\nRun Code Online (Sandbox Code Playgroud)\n后
\n/client-workspace 中包含 NxWorkspace 的新文件夹结构:
\n/dotnet-webapi\n/client-workspace (NxWorkspace)\n /apps\n /client1-angular\n /client2-angular\n /client3-angular\n /libs\n /tools\nRun Code Online (Sandbox Code Playgroud)\n相对
\n根目录中的 NxWorkspace 尽管它根本不会使 .Net Core API 受益,而且感觉就像是将 API 埋藏在 JS 生态系统中一样:
\n/apps\n /dotnet-webapi\n /client1-angular\n /client2-angular\n /client3-angular\n/libs\n/tools\nRun Code Online (Sandbox Code Playgroud)\n 将我们的应用程序从 .Net Core 3.1 升级到 5.0.6,并且使用现有数据库一切正常。如果我删除数据库并运行迁移,我会收到此错误:
没有实体类型映射到数据操作中使用的表“UserClause”。要么将相应的实体类型添加到模型中,要么在数据操作中指定列类型。
该UserClause表不再存在,它在失败的迁移中被重命名,但如果此特定迁移完成,它将是该表Agreement,但由于缺少实体类型而导致此迁移,该实体类型肯定也不存在,因为它最初是运行一年多前。
任何人都知道为什么迁移会寻找实体类型,以及如何解决该问题?似乎不应该在运行迁移时检查实体。
我正在尝试验证使用指令生成的动态表单输入并隔离范围.在指令之外我有主要形式,在ng-repeat中我试图使用ng-form,但它不会显示错误消息.最初我在ng-repeat上有ng-form,但是认为这不起作用,因为它超出了指令的范围,所以把它放在指令的父div上,但仍然没有显示无效电子邮件的验证.
具有ng-repeat和field指令的表单
<form name="mainForm"
role="form"
ng-controller="WizardFormController as wizFormCtrl"
ng-submit="submit( mainForm.$valid )"
novalidate>
<div ng-repeat="field in panel.form_fields">
<form-field field="field"
model="models[field.field_name]" ng-form="subForm">
</form-field>
</div>
<div class="form-group clearfix">
<button class="btn btn-primary pull-right"
ng-click="update( models )"
ng-disabled="mainForm.$invalid">Save Progress</button>
</div>
</form>
Run Code Online (Sandbox Code Playgroud)
表格字段指令
<div class="form-group" ng-form="subForm">
<label for="{{field.field_name}}">{{field.field_label}}</label>
<input type="text"
class="form-control"
id="{{field.field_id}}"
name="{{field.field_name}}"
ng-model="model">
<div ng-show="subForm[field.field_name].$dirty &&
subForm[field.field_name].$invalid">Invalid:
<span ng-show="subForm[field.field_name].$error.email">This is not a valid email.</span>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
看起来它应该工作查看生成的标记,指示该字段是ng-valid:
<div class="form-group ng-scope ng-dirty ng-valid-required ng-valid ng-valid-email"
ng-form="subForm">
Run Code Online (Sandbox Code Playgroud)
这只是我访问subForm的方式:
subForm[field.field_name].$dirty
Run Code Online (Sandbox Code Playgroud)
更新 我找到了解决这个问题并在下面回答,请看这里
我已经在输入事件(onKeyDown)上ReactiveForm FormControl使用了一个货币属性指令@HostListener来删除所有无效字符(字母和符号),因为它们被输入到输入中,但允许数字和小数.但是,如果a在空输入字段中键入无效字符(即.)并且指令将其删除,则不会更新模型.
我使用货币指令添加了一个plunker设置.要了解我的问题,请遵循以下步骤:
123a你没有a在输入中输入,因为不允许使用字母,并且由于表单无效而按钮被禁用(好)123.456你没有6在输入中输入,因为只允许2个小数位,并且由于表单无效而按钮被禁用(好)a你没有a在输入中获得,但是对接是启用的,因为模型认为它有一个ain,即使UI没有显示它(坏)您可以通过单击按钮并查看控制台,日志this.form.value和显示来验证模型是否未更新{ amount: 'a' }.如果您接下来键入一个有效字符,模型将只包含该字符,并且a将被删除.因此,只有在这种情况下,模型才能正确更新.
这是在使用AngularJS容易解决的问题ngModel validator and parser pipes,对modelValue,$setViewValue以及$render()更新和力AngularJS运行$摘要.你是怎么做Angular的?
这是我的属性指令的片段,它成功地删除了不需要的字符:
@HostListener('input', ['$event'])
onKeyDown(event: KeyboardEvent) {
const input = event.target as HTMLInputElement;
// Only numbers and decimals
let trimmed = input.value.replace(/[^\d\.,]+/g, ''); …Run Code Online (Sandbox Code Playgroud)