在TypeScript中计算

时间:2015-03-27 10:11:05

标签: knockout.js typescript devextreme

我遇到以下问题。以下代码适用于JS:

Application1.Trackers = function (params) {

var viewModel = {
    dsTrackers: new DevExpress.data.DataSource({
        store: Application1.db,
        searchExpr: "Bezeichnung"
    }),

    searchString: ko.observable(''),
    find: function () {
        viewModel.showSearch(!viewModel.showSearch());
        viewModel.searchString('');
    },
    showSearch: ko.observable(false),
};

ko.computed(function () {
    return viewModel.searchString();
}).extend({
    throttle: 500
}).subscribe(function (value) {
    viewModel.dsTrackers.filter("Bezeichnung", "contains", value);
    viewModel.dsTrackers.pageIndex(0);
    viewModel.dsTrackers.load();
});

return viewModel;

};

在打字稿中我试过这种方式,但这不起作用:

module MyExtremeApp {
export function Trackers(params: { id: any }) {
    return {
        dsTrackers: new DevExpress.data.DataSource({
            store: MyGlobals.oTrackerManager.getTrackerCustomStore(),
            searchExpr: "Bezeichnung"
        }),

        searchString: ko.observable(''),
        find: function () {
            this.showSearch(!this.showSearch());
            this.searchString('');
        },
        showSearch: ko.observable(false),
    };

    ko.computed(() => {
        return this.searchString();
    }).extend({
        throttle: 500
    }).subscribe(function (value) {
        this.dsTrackers.filter("Bezeichnung", "contains", value);
        this.dsTrackers.pageIndex(0);
        this.dsTrackers.load();
    });
}

}

它永远不会跳转到ko.computed()。有没有人知道为什么不呢? 我是打字稿的新手

非常感谢你。 最诚挚的问候

1 个答案:

答案 0 :(得分:0)

由于您要转移到TypesSript,您应该使用opertunity来思考面向对象并使用类和模块。这样您就可以生成更易读的代码。 你的课可能如下:

import mm_data = require('pathToMyDataClass');
import mm_globals = require('pathToMyGlobals');

export interface ITrackerParms {
    id: any;
}
export class Trackers {
    constructor(parms: ITrackerParms) {
        this.parms = parms;
        this.dsTrackers = new DevExpress.data.DataSource({
            store: mm_globals.MyGlobals.oTrackerManager.getTrackerCustomStore(),
            searchExpr: "Bezeichnung"
        });
        this.searchString.extend({ throttle: 500 });
        this.searchString.subscribe((val: string) => {
            this.dsTrackers.filter("Bezeichnung", "contains", val);
            this.dsTrackers.pageIndex(0);
            this.dsTrackers.load();
        }, this);
    }
    public parms: ITrackerParms;
    public dsTrackers: mm_data.ITrackerSource; //interface from your datasource module
    public showSearch = ko.observable(false);
    public searchString = ko.observable('');
    public find() : void {
        this.showSearch(!this.showSearch());
        this.searchString('');
    }
}

但是你的问题是基于确保在类的构造函数中设置subscrptions和computed(或者在你的例子中等于构造函数)。 实际上你不需要在你的例子中使用compuded,因为你可以扩展Knockout observable以进行throtteling。