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(目前已被注释掉),它就不起作用了。我创建了一个简单的 Plunker来展示这个问题。当您比较 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

您应该在 it() 函数中调用isolateScope(),而不是在 beforeEach() 中。

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 回答