私が観察可能な配列をフィルタリングしようとしていますが、私はすべての私のモデルのフィールド名を変更ko.utils.arrayFilter方法であると信じて何に起因問題に実行しています小文字。このプロジェクトでTypescriptが使用されていることに注意してください。私はfilterInchesを呼び出すプログラムの別の部分で指定された配列をフィルタリングするための()メソッドをQ.PromiseとKO.mappingは適切な型にオブジェクトの配列を変換しない
inches = ko.observableArray<Models.MyListModel>([]);
:私は次のフィールドを持っている私のViewModelに
export class MyListModel {
constructor(jsObject?: {}) {
if (jsObject) {
ko.mapping.fromJS(jsObject, {}, this);
}
}
Text = ko.observable<string>();
Value = ko.observable<string>();
}
:
この
は私のモデルでありますいくつかの基準。 valueパラメーターは、ドロップダウンで現在選択されている値です。filterInches(value) {
if (value == 6) {
var filtered = ko.utils.arrayFilter(this.inches(),
function (item) {
if (parseInt(item.Text()) <= 8)
return true;
});
this.filteredInches(filtered);
} else {
this.filteredInches(this.inches());
}
}
エラーはコンパイル時にスローされませんが、私は、ブラウザでアプリケーションを実行するとき、私は「item.Textは関数ではありません」というエラーを取得します。 Chromeのコードをステップ実行すると、項目がテキストフィールドと値フィールドを持つ匿名オブジェクトに変換されたように見えます。フィールドが小文字になっているので、私が問題になっていると思います。この現象の原因は何ですか?
編集: 私はこのコードの別の部分に取り組んでいますが、私はなぜそれが動作していないのか見始めていると思います。私はそれがQ Promiseライブラリと関係があると信じていますが、なぜこのライブラリがうまくいかないのか理解できていません。私は、このコードを書いた開発者は、自分が行っていると思っていることをしていないことに気づいていないと思います。
私は何かが間違っていることを確認するために試してみた最初のことは、我々のモデルのプロパティ名を変更することです:今
export class MyListModel {
constructor(jsObject?: {}) {
if (jsObject) {
ko.mapping.fromJS(jsObject, {}, this);
}
}
Cat = ko.observable<string>();
Chicken = ko.observable<string>();
}
、我々は戻って改訂filterInches()メソッドは、我々に行けばそのitem.Catはコンパイル時に動作しますが、Chromeのコードをステップ実行すると、実際にはItemオブジェクトにCatというプロパティはありません(定義されていません)。その性質はまだテキストと値です:
filterInches(value) {
if (value == 6) {
var filtered = ko.utils.arrayFilter(this.inches(),
function (item) {
if (parseInt(item.Cat()) <= 8)
return true;
});
this.filteredInches(filtered);
} else {
this.filteredInches(this.inches());
}
}
これは、我々はJSONから取得しているオブジェクトはMyListModelオブジェクトにマッピングされて取得されていないことを私に伝えます。私は、MyListModelクラス自体は問題ないと思う。
私が最初の場所でインチを取得するコードに起因すると思われる問題:
refreshInches() {
this.DataService.getInches().done(entities => {
this.inches(entities);
});
}
、その後getInches()メソッドは次の通りである:
がgetInches(): Q.Promise<Array<Models.MyListModel>> {
return Q($.getJSON(this._baseUrl + 'GetInches'));
}
私は思いますこのコードの本来の目的は、インチデータをエンドポイントから非同期的に取得し、jsonデータをMyListModelオブジェクトに変換することでした。前述のように、私はQ.Promiseに慣れていないので、getInches()メソッドで何が間違っているのか知ることはできません。ただ、JSONデータから匿名オブジェクトの配列を返すだけであることは明らかです。
エンドポイントから返されるJSONオブジェクトは、次のようになり参考:getInches()メソッドは、行うことになっているものを行うに改善することができる方法を誰もが知っている
[{"text":"0","value":"0"},{"text":"1","value":"1"},...]
?
KnockoutJSはオープンソースで、[arrayFilter'ソースコード](https://github.com/knockout/knockout/blob/master/src/utils.js#L149)をチェックしましたが、どんなlowercasingもしないでください。いずれにしても、(完全なコードを含めるか、有益な/可能なコンパイル済みのJavaScriptか、完全なTSコードを使用しないなどで)作成しようとする可能性がある場合は、[mcve]が必要です。 "item.Textが" として定義されている場合 – Jeroen
"のparseInt(item.Text)" はNaNを返し、 "本文= ko.observable();" –
TSV
その行はおそらく 'parseInt(item.Text()、10)'でなければなりません。 – Jeroen