2

次のディレクティブがあります。

offerListSorters.directive('offersSorter', ['myState', '$templateCache', function (myState, $templateCache){
  return {
    scope: {},
    controller: function($scope, $element, $attrs, $transclude) {
      [...]
    },
    restrict: 'E',
    //templateUrl: 'partials/offersSorterDirective.html',
    template: $templateCache.get('partials/offersSorterDirective.html'),
    replace: true,
    transclude: true
  };
}]);

Karma + Jasmine を使用してこのコードをテストすると、動作します。しかし、templateUrl (現在はコメントアウトされています) に切り替えると、機能しません。この問題を示すために、単純なプランカーを作成しました。sorter ディレクティブと bsorter ディレクティブを比較すると、テンプレートの代わりに templateUrl を使用すると、コンパイルされた要素での isolateScope() 呼び出しが壊れているように見えます。何か案は?

4

3 に答える 3

1

これは最も奇妙なことです。これは、実際には、templateUrl を使用している場合に、分離されたスコープを取得できないバグだと思います。テンプレート自体は正しく読み込まれますが、スコープは読み込まれません。追加のロギングでplnkrを更新しましbsorterた。コンソールをチェックアウトすると、ng-isolate-scope クラスが取得されず、スコープが未定義として返されることがわかります。

編集:

コンパイル関数が呼び出されたときにコンソール メッセージをログに記録するように、plnkr をさらに更新しました。これは私の javascript/angularJS の知識の限界ですが、 bsorter compile 関数は、スコープが返された後に呼び出されたものとしてログに記録されます。以前に呼び出された sorter compile 関数とは異なります。

于 2014-04-12T03:13:58.790 に答える
0

beforeEach() ではなく、it() 関数で isolateScope() を呼び出す必要があります。

describe("Testing...", function(){
    var element, isoScope;

    beforeEach(function(){
        module("myApp");

        inject(function($rootScope, $compile){
            var scope = $rootScope.$new();
            element = $compile(angular.element("<sorter></sorter>"))(scope);
            // isoScope = element.isolateScope();  <- Move from here
            $rootScope.$digest();
        });
    });

    it("something...", function(){
        isoScope = element.isolateScope();  // <- to here
        expect(isoScope.someProp).toBe("someValue");
    });
});
于 2014-06-07T16:15:36.550 に答える
0

$compile を介してディレクティブを作成した後、$rootScope.$digest() を呼び出す必要があります。その後、動作するはずです (現在、変数parentScope で $digest() を呼び出しています。これは、$rootScope で作成された新しいスコープです)。 .$new())

于 2015-03-26T13:06:15.983 に答える