1

Array に関数を追加できるように、(TypeScript を使用して) Array をサブクラス化しました。以下のコードを参照してください。

その後、{for}JsRender/JsViews のタグが機能しなくなっていることに気付きました。また、JsRender/JsViews が配列を反復処理するために使用していることにも気付きました。これは、サブクラス化された配列$.isArray(...)を返します。false

JsRender/JsViews コードを使用するように変更する(data instanceof Array)と、機能します。

JsRender/JsViews{for}タグを使用してサブクラス化された配列を取得する別の方法 (JsRender/JsViews コードを変更せずに) はありますか?

タイプスクリプト:

module MyModule {
    export class Collection<T> implements Array<T> {
        constructor() {
            Array.apply(this, arguments);
            return new Array();
        }

        length: number;
        toString(): string { return ""; }
        //... All other Array properties/methods
    }

    // replace dummy declarations with the real thing
    Collection['prototype'] = new Array();
}

生成された Javascript:

var MyModule;
(function (MyModule) {
    var Collection = (function () {
        function Collection() {
            Array.apply(this, arguments);
            return new Array();
        }

        Collection.prototype.toString = function () { return ""; };
        //... All other Array properties/methods

        return Collection;
    })();
    MyModule.Collection = Collection;

    // replace dummy declarations with the real thing
    Collection['prototype'] = new Array();
})(MyModule|| (MyModule= {}));
4

1 に答える 1

2

SubclassedCollection は JavaScript 配列ではありません (jQuery オブジェクトが JavaScript 配列ではないのと同様)。コレクションとは異なり、ではなく -"[object Object]"から返されます。Object.prototype.toString.call(ob)"[object Array]"

考えられるアプローチの 1 つは、次の関数を使用することです。

function toArray(ob) {
    return Array.prototype.slice.call(ob);
}

そしてどちらかを書く

MyModule.ViewModel = { Coll: toArray(collection2) };

またはtoArray、ヘルパー ( ~toArray) またはコンバーター ( "toArray") として登録し、テンプレートを次のように記述します。

{{for ~toArray(Coll)}}

(または代わりに{{for Coll convert=~toArray}}または{{for Coll convert="toArray"}})。

jsfiddle の更新されたフォークは次のとおりです: http://jsfiddle.net/16L670re/

于 2015-03-12T22:26:19.260 に答える