2014-10-28 19 views
7

Tôi đang mong nhận được một thứ gì đó từ phạm vi tách biệt ra khỏi chỉ thị help-button của tôi.AngularJS jasmine isolateScope() trả về undefined

it('should contain proper scope, depending on attributes', function() { 

     var el = compile('<help-button context-id="1"></help-button>')(scope); 
     scope.$digest(); 


     console.log("el: " + el); 
     console.log('Isolated scope: ' + el.isolateScope()); 
    .. 
    }); 

- trước mỗi bài kiểm tra nó

beforeEach(inject(function($compile, $rootScope, $injector) { 

    compile = $compile; 
    scope = $rootScope.$new(); ... 

nó in:

'el: [Object Object]' 
'Isolated scope: undefined' 

Câu hỏi đặt ra là: tại sao tôi nhận được lại không xác định ? Ngay cả khi không có gì trong phạm vi cô lập, nó vẫn phải là đối tượng {} rỗng. Nhưng dù sao - thử nghiệm là sai - nó không hiển thị phạm vi cô lập mà (trong thực tế) chứa dữ liệu trong đó.

Trả lời

6

Tôi ngu ngốc.

Nhưng sẽ trả lời câu hỏi của riêng tôi vì "ngu ngốc là ngu ngốc" - tức là có thể một lần sẽ làm như vậy (hoặc cho bản thân tôi từ tương lai).

Sự cố xảy ra trong số helpbutton.html mà chỉ thị của tôi đang sử dụng (mà tôi không hiển thị/đề cập trong câu hỏi này).

Vì vậy, templateUrl được đề cập đến helpbutton.html tệp được cho là được biên dịch thành html đúng cách.

Khi tôi xem xét kết quả đầu ra của el.html(), tôi nhận thấy rằng nó không được hiển thị chính xác (có một số thẻ bị thiếu hoặc thứ gì đó).

Lý do tại sao tôi không thể nhận bất kỳ số scope nào từ số element.

(mặc dù sẽ được tốt đẹp để có một số loại ngoại lệ trên log nếu mẫu không được trả lại đúng vào html)

+5

Vậy bạn khắc phục sự cố html của mình như thế nào? – joncodo

+0

Bạn nên đánh dấu câu trả lời của chính mình làm câu trả lời đúng. – mostruash

1

Chỉ tình cờ gặp cùng một vấn đề, nhưng với một nguyên nhân khác nhau. Chỉ trong trường hợp bất cứ ai khác có cùng một vấn đề, và điều này có thể thực sự rõ ràng một khi bạn đã nhìn thấy nó trước đây, nhưng vẫn còn.

Nếu bạn đang sử dụng templateUrl, thì hàm .isolateScope() sẽ trả về không xác định cho đến khi bạn thực sự đã gọi. $ Digest và $ httpBackend.flush();

Khi bạn sử dụng mẫu trực tiếp từ chỉ thị, nó sẽ có sẵn vào thời điểm bạn thực hiện $ compile (element) (scope).

Điều này có thể gây ngạc nhiên nếu bạn chỉ thay đổi một chỉ thị để sử dụng một templateUrl, hoặc thay đổi nó từ thường xuyên thành isolateScope.

 responseHtml = '<div></div>'; 
     $httpBackend.expectGET('template.html').respond(200, responseHtml); 

     var html = '<widget></widget>'; 
     element = angular.element(html); 
     var compiled = $compile(element)(scope); 

     console.log(element.isolateScope()); // undefined 

     $rootScope.$digest(); 

     console.log(element.isolateScope()); // undefined 

     $httpBackend.flush(); 

     console.log(element.isolateScope()); // now it will be available 
Các vấn đề liên quan