gpt4 book ai didi

javascript - 单元测试中的指令隔离范围

转载 作者:行者123 更新时间:2023-11-30 17:29:31 32 4
gpt4 key购买 nike

我有一个相当复杂的指令,下面是一个简化的形式。

http://plnkr.co/edit/QV2QyZlknGyN3zTiv3w4?p=preview

如果我删除兄弟元素,它会起作用:http://plnkr.co/edit/rMeCyKiMm4jPqh2NFKPf?p=preview

当我的模板有其他同级 html 标签时,如评论的那样,

console.log(el.isolateScope()) --> undefined
console.log(el.children().scope()) --> isolated scope

我期望通过 el.isolateScope() 获得隔离指令范围。为什么它是未定义的?如果有其他元素,为什么行为会有所不同(仍然,该指令不是其他元素的子元素,而是同级元素)

js:

var app = angular.module('plunker', []);

app.directive('myTest', function () {
return {
restrict: 'E',
scope: {},
replace: true,
template: '<div><div>far boo</div></div>',
link: function (scope, element, attrs, controller) {
scope.msg = 'bar';
},
controller: function($scope){
$scope.msg = 'foo';
}
};
});

规范:

describe('myTest directive:', function () {

var scope, compile, validHTML;

//validHTML = '<my-test></my-test>';
validHTML = '<script type="text/ng-template" id="directive/propTmplAdd.html"><div></div></script><my-test></my-test>';

beforeEach(module('plunker'));

beforeEach(inject(function($compile, $rootScope){
scope = $rootScope.$new();
compile = $compile;
}));

function create() {
var elem, compiledElem;
elem = angular.element(validHTML);
compiledElem = compile(elem)(scope);
scope.$digest();

return compiledElem;
}

it('should have a scope on root element', function () {
var el = create();

console.log('isolateScope', el.isolateScope())
console.log('ch isolateScope', el.children().scope())
console.log('ctrl', el.controller('myTest'))


expect(el.isolateScope()).toBeDefined();
expect(el.isolateScope().$id).not.toEqual(scope.$id);
});

it('should have a populated scope', function(){
var el = create();
expect(el.isolateScope().msg).toBeDefined();
expect(el.isolateScope().msg).toEqual('bar');
});
});

最佳答案

代码中的 create() 函数返回的 jqLit​​e 包装对象将包含两个元素。

el[0] 将是:

<script type="text/ng-template" id="directive/propTmplAdd.html" class="ng-scope"><div></div></script>

el[1] 将是:

<div class="ng-scope ng-isolate-scope"><div>far boo</div></div>

当调用 el.isolateScope() 时,它将在第一个没有元素的元素上被调用。

您要么必须以不同方式编译元素,要么必须在 jqLit​​e 中重新包装正确的元素。

例如:

it('should have a populated scope', function() {

var elements = create();
var element = angular.element(elements[1]);

expect(element.isolateScope().msg).toBeDefined();
expect(element.isolateScope().msg).toEqual('bar');
});

关于javascript - 单元测试中的指令隔离范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23446129/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com