我需要能够formControlName为我的自定义组件使用该指令。
我一直在阅读有关ControlValueAccessor为子组件实现的多个 SO 问题,这一切似乎都非常脆弱。
许多示例都将<div>或<span>元素转换为表单元素,因此实现ControlValueAccessor.
但是,我的组件只是使用本机<input>元素。我正在创建一个单独的组件,因为我想在输入中使用一些图标,而且我显然不想在任何地方复制/粘贴图标 css。
我遇到了一个DefaultValueAccessor类,它似乎是 angular 用于所有本机输入元素的类。我是否也可以为我的自定义组件以某种方式利用这种行为?
我只是不想复制这个功能。就错误和各种浏览器行为而言,长期维护它可能很困难。我宁愿只使用已经与本机输入相关联的功能。
这是<jg-search>(我的自定义组件)的代码片段:
<div>
<svg>
<!-- some content -->
</svg>
<label for="search">Search</label>
<input id="search" type="text"></input>
<svg>
<!-- some content -->
</svg>
</div>
Run Code Online (Sandbox Code Playgroud)
我希望能够以一种形式这样称呼它:<jg-search formControlName="keyword">.
这可以通过ControlValueAccessor在 SearchComponent 中实现来实现。但由于我只是使用本机<input type="text">,我不想重新实现DefaultValueAccessor.
例如,看一下我对堆栈的简单实现:
var MyStack = (function() {
var min;
var head;
// Constructor
function MyStack() {
this.size = 0;
}
MyStack.prototype.push = function(val) {
var node = new Node(val);
if (typeof min === 'undefined' || val < min) {
min = val;
}
++this.size;
if (typeof head === 'undefined') {
head = node;
} else {
node.next = head;
head = node;
}
};
MyStack.prototype.pop = function() {
if (typeof head === 'undefined') {
throw new Error('Empty stack');
}
--this.size;
var …Run Code Online (Sandbox Code Playgroud) 假设我在父组件中有一个函数,我想将其用作子组件的回调。哪种方式更好?
render() {
return (
<Child handleClick={this.handleClick.bind(this)} />
)
}
Run Code Online (Sandbox Code Playgroud)
或者
constructor() {
super();
this.handleClick = this.handleClick.bind(this);
}
Run Code Online (Sandbox Code Playgroud)
根据这个eslint,最好在构造函数中这样做,因为 render() 方法可能会被多次调用。这对我来说非常有意义。
然而,这仅仅意味着绑定函数最终成为每个实例的属性。从而违背了原型的全部目的。
我确实了解属性初始值设定项:
handleClick = () => {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
但看起来这个语法还远没有被 ES2017(或者无论下一个可能是什么)达成一致。出于这个原因,我害怕使用这种语法,因为它可能永远不会进入该语言。
那么,说了这么多,解决这个问题的最佳方法是什么?
我是 Angular 5 应用程序上下文中单元测试的新手。现在,我正在尝试对基本组件进行单元测试。
该组件称为 CardComponent,在该组件的 HTML 中,我将其称为 CheckboxComponent。
所以这是 CardComponent 的 HTML:
<div>
<p>Test</p>
<jg-checkbox [label]="'Test label'"></jg-checkbox>
</div>
Run Code Online (Sandbox Code Playgroud)
如您所见,没有什么复杂的事情发生。
但是, CheckboxComponent 确实注入了一个服务。对于这个问题,我将其称为 TestService。
因此,当我对 CardComponent 进行单元测试时,这是我的测试平台:
TestBed.configureTestingModule({
declarations: [
CheckboxComponent
]
}).compileComponents();
Run Code Online (Sandbox Code Playgroud)
然后我运行这个测试:
it('should create', () => {
expect(component).toBeTruthy();
});
Run Code Online (Sandbox Code Playgroud)
这只是通过 CLI 创建的默认测试。
但是现在,它抱怨 TestService 没有提供程序。我真的应该注入(和模拟/间谍)吗?
这似乎有点倒退,因为我只关心 CardComponent,我不应该关心 CheckboxComponent,对吧?这就是单元测试的全部意义所在。
否则,由于 Angular 具有分层组件,随着我的应用程序的增长,我可能不得不深入很多层次。
这不可能是对的。
有人可以帮忙解决这个问题吗?我感谢您的帮助!
我的问题标题可能有点令人困惑,所以希望以下细节可以清除它.
从本质上讲,导航栏不受我的控制,它只用简单的HTML/JS编写.我的应用程序是用Angular编写的,并在其中设置了路由.
我可以做什么来从导航栏中触发我的Angular应用程序中的路由?
假设我在index.html中有以下内容:
<body>
<header>
<a onclick="history.pushState({}, '', '/home');">Home</a>
<a onclick="history.pushState({}, '', '/test');">Test</a>
</header>
<app-root></app-root>
</body>
Run Code Online (Sandbox Code Playgroud)
显然,我的Angular应用程序从<app-root>它上面的标记开始并且不知道它.但是,有没有办法影响Angular中的路由?
我认为调用history.pushState()会改变它,但它似乎没有做任何事情.它确实更改了URL,但浏览器上显示的组件保持不变.它不会切换组件.
有没有人有这个问题的解决方案?
我非常感谢你的帮助!
我一直在考虑使用React作为Grails应用程序的前端,但是我在启动时遇到了一些麻烦.
到目前为止,我已经习惯在Webpack的帮助下使用Node/NPM编写一个React应用程序,这非常简单,因为有大量的文档可供使用.
但是,我正在努力找到任何与Grails无缝集成React的东西.
理想情况下,我会做grails run-app,它应该照顾一切.我不希望其他团队成员担心启动两个不同的服务器或类似的东西.
如果有人以前做过这件事,请告诉我.
这是我当前的文件夹结构:
-- src
-- js
-- page 1
-- index.js
-- actions
-- components
-- reducers
-- page 2
-- index.js
-- actions
-- components
-- reducers
-- page 3
-- index.js
-- actions
-- components
-- reducers
Run Code Online (Sandbox Code Playgroud)
这是我的webpack.config.js:
module.exports = {
entry: {
page1: './src/js/page1/index.js',
page2: './src/js/page2/index.js',
page3: './src/js/page3/index.js',
},
output: {
path: './assets/javascripts',
publicPath: '/assets/',
filename: '[name].js'
}
}
Run Code Online (Sandbox Code Playgroud)
所以每当我创建一个新页面时,我必须在我的入口对象中添加另一行.这可能变得非常大而且非常混乱.
那么有没有办法让webpack循环遍历/ src/js /文件夹中的所有文件夹,并自动使相应文件夹中的index.js成为入口点?
谢谢你的帮助!
我正在尝试创建一个通用的幻灯片组件,它将采用多个组件,然后它将根据某些用户操作循环播放。
它与 Angular Material 的stepper 组件非常相似。
到目前为止,我已经发现您可以使用@ContentChildren来获取对多个(传入)组件/内容的引用,但我不确定如何实际呈现组件。
这是我创建的一个示例:https
://stackblitz.com/edit/angular-yjfbwb app.component.html 文件包含一个<tours></tours>标签,只要您用#tour. 在 tours.component.ts 中,您会看到我只是在遍历传入的组件。
但是我如何实际渲染它们?
我用谷歌搜索了一下,似乎我这样做是不可能的?但也许我没有正确搜索。理想情况下,我想让我的团队尽可能简单地使用这个游览组件(基本上就是上面例子中的情况)。
任何帮助将不胜感激!
我试图熟悉Java 9中引入的模块系统,我想知道利用它的最佳方法。
对于我正在编写的库,我想执行以下操作(忽略软件包的命名):
com.myproject.api。用户可以使用此类中的所有内容。com.myproject.core。用户应该无法在此处访问任何内容。我的理由是,用户无需对实现逻辑感到困惑或不知所措。取而代之的是,他们可以仅查看(希望)干净且记录良好的接口。
但是,由于Java程序包的工作方式,很难在不将所有程序包都私有的情况下限制某些类的使用。但是我不喜欢将所有类都放在一个包中,而是希望将它们组织成各种包。
在阅读了有关模块系统的知识之后,我相信我可以做以下事情来实现我想要的。这是module-info.java文件:
module com.myproject {
exports com.myproject.api;
}
Run Code Online (Sandbox Code Playgroud)
据我了解,我的库用户将能够使用com.myproject.api包中定义的所有内容(通过require com.mypojrect.api在其自己的module-info文件中使用)。
但是,用户是否可以通过任何方式访问com.myproject.core软件包中的任何内容?我对他们(通过IDE或源代码本身)查看代码没有问题,但我只是不想最终支持我不想公开的类/方法/逻辑。
我担心没有模块化应用程序的用户或将我的库JAR放在类路径中的用户将以某种方式找到一种方法来访问假定的受限软件包。
如果您需要其他任何信息,请告诉我。
我有一个名为"hours.txt"的文本文件,其中包含我想要读取的整数行并将它们复制到数组中.
整数是一周内8名员工的工作小时数.所以我创建了一个二维数组,其中行是员工,列是一周的日子.
public static void read()
{
Scanner read = new Scanner(new File("hours.txt"));
int[][] hours = new int[8][7];
for(int r=0; r<hours.length; r++)
{
for(int c=0; c<hours[0].length; c++)
{
while(read.hasNextInt())
{
hours[r][c]= read.nextInt();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误:
EmployeeHours.java:16:错误:未报告的异常FileNotFoundException; 必须被抓住或宣布被抛出
这是为什么?谢谢你的帮助!
angular ×4
java ×2
javascript ×2
reactjs ×2
webpack ×2
arrays ×1
closures ×1
grails ×1
html ×1
java-9 ×1
java-module ×1
unit-testing ×1
webpack-2 ×1