为什么我需要将$viewValue
放在下面示例中的键值对中(使用Angular 1.6.2和Typescript)?
export class PageHeaderComponent implements ng.IComponentOptions {
public template: string = `
// ... other markup omitted
<input type="text"
name="search"
class="form-control text-field"
placeholder="{{$ctrl.searchPlaceholder}}"
ng-model="$ctrl.search"
uib-typeahead="item for item in $ctrl.getItems({value: $viewValue})"
/>
...
public bindings: any = {
headerTitle: "<",
showBackButton: "<",
entityName: "<",
addAction: "&",
adding: "<",
search: "=",
searchPlaceholder: "<",
getItems: "&"
};
}
此PageHeader
组件包含在LandingPage
组件中。 getItems
是LandingPage
控制器上的方法。
export class LandingPageComponent implements ng.IComponentOptions {
public template: string = `
<div class="landing-page">
<page-header
header-title="'Businesses'"
add-action="$ctrl.showAddBusiness()"
entity-name="'Business'"
search-placeholder="'Search for a business'"
search="$ctrl.search.name"
adding="$ctrl.adding",
get-items="$ctrl.getItems({value})"
></page-header>
// ... other markup omitted
`;
public controller: any = LandingPageComponentController;
}
export class LandingPageComponentController {
// ... Irrelevant details omitted
public getItems(value: {value}): Promise<string[]> {
return new Promise((resolve, reject) => {
resolve(["one", "two", "three", "four"]);
});
}
}
如果我只是简单地传递$viewValue
(并将getItems
的签名更改为getItems(value: string)
,则会收到此错误:
TypeError: Cannot use 'in' operator to search for '$ctrl' in o
。
显然,能够修复错误,我只是想了解为什么我的修复有效。
答案 0 :(得分:1)
这不是uib-typeahead
,而是在LandingPageComponent
和{{1}之间使用输出事件绑定(&#39;&amp;&#39;) }。
您实际上可以稍微简化一下代码:
在PageHeaderComponent
模板中:
LandingPageComponent
在get-items="$ctrl.getItems(value)"
:
LandingPageComponentController
为什么?
所以在public getItems(value: string): Promise<string[]> {
return new Promise((resolve, reject) => {
resolve(["one", "two", "three", "four"]);
});
}
,当你去:
PageHeaderComponent
考虑AngularJS为$ctrl.getItems({value: $viewValue})
执行此操作:
LandingPageComponent
实际情况并非如此,但我认为它应该可以帮助您理解为什么我们需要传回一个对象(而不是直接传递值)
这篇文章非常好地描述了为什么我们需要以这种方式处理输出事件:
http://www.codelord.net/2016/05/13/understanding-angulars-and-binding/