2

extend次のケースを処理する方法に関する実装 (またはパターン) はありますか? 私の知る限り、AngularでもUnderscoreでも簡単に行う方法はありませんよね?

それ以外の場合は、ここに私の実装がありますが、既に行われたことがあるかどうか、またはいずれにせよ、私のコードについてのフィードバックを知りたいです。ありがとう!

http://jsbin.com/welcome/52916/edit

/**    
Extends the target object with the properties in the source object, with the following special handling:

-   it doesn't extend undefined properties, i.e.
        target: { a: 10 }
        source: { a: undefined }
        result: { a: 10 }

-   it does nested extends rather than overwriting sub-objects, i.e.
        target: { b: { i: 'Hi' } }
        source: { b: { j: 'Bye' } }
        result: { b: { i: 'Hi', j: 'Bye' } }

*/
function extend( target, source ) {
  _.each( _.keys( source ), function( k ) {
    if (angular.isDefined( source[k] )) {
      if (angular.isObject( source[k] )) {
        extend( definedOr( target[k], {} ), source[k] );
      }
      else {
        target[k] = source[k];
      }
    }
  });
  return target;
}
4

2 に答える 2

3

はい、私は推測します、あなたの問題を解決すること_.extend_.defaults解決することもありません、そして私のAngular-Fuはそこでコメントするのに十分ではありません。

しかし、それはjQuery.extend(true, target, source)あなたの両方のユースケースを解決するように見えます。メソッド呼び出しの、は、メソッドがすでに言及したケースで機能しているtrue間に、ディープエクステンドを実行します。extendundefined

ソースオブジェクトとターゲットオブジェクト間の競合を解決するためのより詳細な制御が必要な場合、私は常にそれObject.merge(target, source, deep:boolean, resolve:boolean|function)がより柔軟であることに気づきました。あなたがそれがSugar.jsと呼ばれるライブラリからのメソッドであると思っている場合に備えて。

完全を期すために、Sugar.jsメソッドは、特定のユースケースに対して以下に示すように使用できます。

Object.merge(target, source, true, false);

それがあなたの質問に答えたことを願っています。

于 2012-11-25T13:01:47.543 に答える
1

AngularJS には単純な拡張機能があります。

angular.extend(target, source);

http://docs.angularjs.org/api/angular.extend

ただし、関数はソースのプロパティをターゲットにコピーするだけで、既存のものはすべて上書きすることを知っておく必要があります。

http://jsfiddle.net/flek/yhuDP/1/

于 2012-11-25T13:44:26.840 に答える