4

まず、このオブジェクトの型が何なのかはっきりとわかりません(おそらく NativeArray ?)。私にとって、ember は、NativeArray mixin を Array.prototype に適用することで、デフォルトの JavaScript 配列をいくつかの mixin でオーバーライドします。

そうは言っても、私のコードでは、次のことを許可して、この種のオーバーライドを行いたいと考えています。

["a", "b", "a"].count("a") // returns 2

私はEnumerable Mixinを再開しようとしていました(私にとっては、この種の機能に適した場所です)

count() メソッドを使用する前に、再開コードが実行されると確信しています。しかし、私はこのエラーが発生します:

Object has no method count().

コードを読むと、mixin を Array.prototype に再適用する必要があるようですが、残念ながらEmber.Enumerable.apply(Array.prototype)何もしません。

更新: いくつかの記事を読んだ後、プロトタイプを理解し始めました。次のようにして配列に関数を追加できます。

Array.prototype.newFunc = function () {
    console.log('bla');
}

しかし、私の場合、たとえば MutableArray を呼び出すことができるようにしたいので、満足のいくものではありませんnewFun()

おそらく、私が望むことを行う唯一の方法は、Enumerable Mixin にカウント メソッドを含めるように PR を作成することです....

他の提案は大歓迎です:)

4

3 に答える 3

4

を探していますreopen。既存のクラスを変更できます。次に例を示します。

Ember.Enumerable.reopen({
    newFunc: function() {
        console.log('blah');
    }
});

警告: 呼び出しreopenは、すでにインスタンス化されているオブジェクトには影響しません。再オープンが呼び出された後に作成されたオブジェクトにのみ影響します。要するに、reopen最初に電話をかけるようにしてください。

于 2012-07-24T17:16:08.763 に答える
3

http://jsfiddle.net/kcjzw/249/

App = Ember.Application.create();

var NativeArray = Ember.Mixin.create(Ember.NativeArray, {
    count: function(ele) {
        var noOfEle = 20;
        //add your logic to count
        return noOfEle;
    }
});

NativeArray.apply(Array.prototype);
console.log(["a", "b", "a"].count("a")); //20

REF: Emberjs のネイティブ配列はディープ コピーをサポートしていませんか?

于 2012-07-24T15:32:27.180 に答える
2

これについては100%ではないので、少し懐疑的に読んでください。ミックスインには、更新時と作成時にたどることができる 2 つの主要なパスがあるようです。1 つは "reopen" メソッドです。これにより、別の mixin がオブジェクトに追加されます。2 つ目は、これらの mixin を実際にオブジェクト自体にマージする「適用」であり、mixin 参照が失われます。したがって、Ember.Enumerable を更新しても、定義した新しいクラスで使用しない限り、何も得られません。

すべての Enumerable 型でその「適用」メソッドをいつでも起動できますが、ちょっと面倒です...おそらく、すべてのメインクラスを検索して返すハックを検出する人もいます...まあ。

もう1つの解決策は、レポをフォークしてメソッドを追加することです(おそらく、頭痛と時間を大幅に節約できます....あなたはこれについて何か言いました)。9.8 ではこの種のことができたと思いますが、これらの新しいビルドではまさにこれに問題があります。

編集:明確にするために、「マージ」とは、実際のメソッドを別のオブジェクトにコピーしたことを意味します。(Array.prototype) のように... 'detect' は Ember.Enumerable を見つけますが、その Mixin は実際には配列によって参照されなくなりました (メソッドは以前にコピーされました)。

新しい mixin を作成し、必要に応じて型に適用するだけでよいと思います (明示的に行っていることを覚えておく必要があります)。現時点では、Array でのみ必要な場合は、Array.prototype に適用するだけです。次にそれが必要になったら、たとえば ArrayController を追加します。

シンプルなフィドラーを作成しましたが、他の人の投稿とほとんど同じです。レポをフォークするのはまだ好きではありません。

于 2012-08-05T04:42:12.060 に答える