我今天才开始学习余烬。 (尝试做yoember.com)教程。请原谅我的新手问题。
我遇到一些问题,不确定自己在做什么错。
问题:
禁用不起作用(始终启用该按钮)
我在做什么:
我有一个包含电子邮件,消息和提交按钮的联系页面。
我想首先禁用该按钮(没有电子邮件,消息时)
到目前为止,这是我所做的:
contact.hbs:
<h1>Contact Page</h1>
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
{{input type="email" value=emailAddress class="form-control" placeholder="Please type your e-mail address." autofocus="autofocus"}}
<small id="emailHelp" class="form-text text-muted">We'll never share your email with anyone else.</small>
</div>
<div class="form-group">
<label for="text">Text</label>
<textarea type="textarea" class="form-control" id="text" placeholder="Text" rows="4" cols="50" value={{message}}></textarea>
</div>
<button disabled={{isDisabled}} {{action 'submitButton'}} type="submit" class="btn btn-primary">Submit</button>
</form>
Contact.js
import Route from '@ember/routing/route';
import { match, not } from '@ember/object/computed';
export default Route.extend({
emailAddress: '',
message: '',
isValid: match('emailAddress', /^.+@.+\..+$/),
isDisabled: not('isValid'),
actions: {
submitButton () {
alert(`Saving of the following email address is in progress:`);
}
}
});
问题:
1)我在做什么错?为什么总是启用该按钮?
2)我做
value=emailAddress
vs value={{emailAddress}}
有什么区别 最佳答案
1)我在做什么错?为什么总是启用该按钮?
您无法在ember中将路线的属性直接绑定到路线的模板。因此,您必须使用路线的控制器。控制器就像路由一样是单例的。因此,这不应该成为问题。
除路由加载和错误状态外,也不建议使用其他操作。它们也应移至控制器。
路由应限于序列化和反序列化应用程序状态。如果您需要按路线进行代码拆分,则这一点很重要。有关详细信息,请参见discussion about the route actions RFC。
由于您没有在app/routes/contact.js
路由中使用任何特定于路由的内容,因此可以将其移至app/controllers/contact.js
并将其基类从@ember/routing/route
更改为@ember/controller
。
2)我做value = emailAddress与value = {{emailAddress}}有什么区别
通常,大括号内不能有大括号。因此{{input value={{emailAdress}} placeholder="Please type your e-mail address."}}
将不是有效的语法。
除此之外,含义取决于上下文:
如果在大括号调用的组件内部使用value=emailAddress
,它将引用值emailAddress
。这可能是由模板范围定义的局部变量(例如,使用let
帮助器)或控制器/组件的属性。如果是组件模板,则甚至可以通过调用组件来传递属性。
为了避免这种混乱,Ember引入了新的组件调用语法。它使用尖括号,并允许在其中使用花括号来引用变量。在这种情况下,<Input value=emailAddress />
将是无效的语法,因为该值必须是变量,并因此带有花括号或字符串。因此,在这种情况下,只有<Input value={{emailAddress}} />
是有效的语法。还请注意,对于这种调用语法,在@value={{emailAddress}}
和emailAddress
之间存在区别,value={{emailAddress}}
将emailAddress
作为参数传递给组件,而value
将绑定到由components元素定义的HTML属性。
请在Ember Guides中查看有关此不同组件调用语法的详细信息。
还有其他一些情况,但是我想从这个问题中猜想是关于组件调用的,这个答案已经很长了。