Ang*_*Boy 6 angularjs typescript angularjs-filter
我试图从Angular控制器调用自定义过滤器但我收到错误:'无法调用其类型缺少调用签名的表达式'.
我在上一个项目中就这样实现了它,所以我不知道出了什么问题.
此时过滤器不包含任何逻辑,因为我需要先进行编译.
这是过滤器:
/// <reference path="../../typings/reference.ts" />
module app {
'use strict';
/**
* Filter models
*/
export class ModelFilter {
public static Factory() {
return function(input: string) {
console.log(input);
return input;
}
}
}
angular.module('app')
.filter('modelFilter', [ModelFilter.Factory]);
}
Run Code Online (Sandbox Code Playgroud)
和控制器所在的地方:
/// <reference path="../../typings/reference.ts" />
module app {
'use strict';
interface ISearchController {
vehicles: IVehicles;
models: any;
setVehicles(): void;
updateModels(make: string): void;
}
class SearchController implements ISearchController {
static $inject = [
'VehicleMakeService',
'VehicleModelService',
'$filter'
];
constructor(private vehicleMakeService: VehicleMakeService,
private vehicleModelService: VehicleModelService,
private $filter: ng.IFilterService,
public vehicles: IVehicles,
public models: any) {
this.setVehicles();
}
setVehicles(): void {
this.vehicleMakeService.getVehicles().then((data) => {
this.vehicles = data;
});
}
updateModels(make: string): void {
var test = this.$filter('modelFilter')(make); // Error here
}
}
angular.module('app').controller('SearchController', SearchController);
}
Run Code Online (Sandbox Code Playgroud)
reference.ts:
/// <reference path="./tsd.d.ts" />
//grunt-start
/// <reference path="../app/app.config.ts" />
/// <reference path="../app/app.module.ts" />
/// <reference path="../app/app.route.ts" />
/// <reference path="../app/home/home.controller.ts" />
/// <reference path="../app/home/home.route.ts" />
/// <reference path="../app/models/vehicles.model.ts" />
/// <reference path="../app/results/results.controller.ts" />
/// <reference path="../app/results/results.route.ts" />
/// <reference path="../app/services/cars.service.ts" />
/// <reference path="../app/services/vehicles.make.service.ts" />
/// <reference path="../app/services/vehicles.models.service.ts" />
/// <reference path="../app/templates/search.controller.ts" />
/// <reference path="../app/templates/search.filter.ts" />
//grunt-end
Run Code Online (Sandbox Code Playgroud)
tsd.d.ts:
/// <reference path="angularjs/angular.d.ts" />
/// <reference path="jquery/jquery.d.ts" />
/// <reference path="angular-ui-router/angular-ui-router.d.ts" />
/// <reference path="angularjs/angular-resource.d.ts" />
Run Code Online (Sandbox Code Playgroud)
Mar*_*cka 10
修改工作示例:
/// <reference path="typings/angularjs/angular.d.ts" />
module app {
// ADDED <--- MODIFIED!
export interface MyModelFilter extends ng.IFilterService {
(name: 'modelFilter'): (input: string) => string;
}
/**
* Filter models
*/
export class ModelFilter {
public static Factory() {
return function(input: string) {
console.log(input);
return input;
}
}
}
angular.module('app')
.filter('modelFilter', [ModelFilter.Factory]);
}
module app {
class SearchController {
constructor(private $filter: MyModelFilter) { // <--- MODIFIED!
}
updateModels(make: string): void {
var test = this.$filter('modelFilter')(make);
}
}
angular.module('app').controller('SearchController', SearchController);
}
Run Code Online (Sandbox Code Playgroud)
问题是TypeScript使用以下定义:
/**
* $filter - $filterProvider - service in module ng
*
* Filters are used for formatting data displayed to the user.
*
* see https://docs.angularjs.org/api/ng/service/$filter
*/
interface IFilterService {
(name: 'filter'): IFilterFilter;
(name: 'currency'): IFilterCurrency;
(name: 'number'): IFilterNumber;
(name: 'date'): IFilterDate;
(name: 'json'): IFilterJson;
(name: 'lowercase'): IFilterLowercase;
(name: 'uppercase'): IFilterUppercase;
(name: 'limitTo'): IFilterLimitTo;
(name: 'orderBy'): IFilterOrderBy;
/**
* Usage:
* $filter(name);
*
* @param name Name of the filter function to retrieve
*/
<T>(name: string): T;
}
Run Code Online (Sandbox Code Playgroud)
对this.$filter('modelFilter').这意味着使用了最后一条规则(即<T>(name: string): T;).因此,this.$filter('modelFilter')类型ng.IFilterService和TypeScript不知道你的任何事情ModelFilter.
您可以通过添加新接口来解决问题,如第一个代码清单中所示.
你说原始代码在你的另一个项目中有效,但除非reference.ts以某种方式修改,否则我似乎不太可能.
| 归档时间: |
|
| 查看次数: |
3241 次 |
| 最近记录: |