Cách gỡ lỗi mã JavaScript Angular


104

Tôi đang làm việc trên một bằng chứng về khái niệm bằng Angular JavaScript.

Làm cách nào để gỡ lỗi mã Angular JavaScript trong các trình duyệt khác nhau (Firefox và Chrome)?


13
uh anglejs bao bọc rất nhiều mã mẫu của bạn và thực thi nó một cách động ... nguồn của lỗi luôn là "angle.js" do đó việc tìm ra nguồn của lỗi gần như là không thể.
user3338098

Câu trả lời:


64

1. Chrome

Để gỡ lỗi AngularJS trong chrome, bạn có thể sử dụng AngularJS Batarang . (Từ các đánh giá gần đây về plugin, có vẻ như AngularJS Batarang không còn được duy trì. Đã thử nghiệm trong các phiên bản chrome khác nhau không hoạt động)

Đây là Liên kết để mô tả và Demo:

Giới thiệu Angular JS Batarang

Tải xuống plugin chrome từ đây: plugin chrome để gỡ lỗi AngularJS

Bạn cũng có thể tham khảo link này: ng-book: Debugging AngularJS

Bạn cũng có thể sử dụng ng-register để gỡ lỗi angle.

2. Firefox

Đối với Firefox với sự trợ giúp của Firebug, bạn có thể gỡ lỗi mã.

Đồng thời sử dụng Tiện ích bổ sung Firefox này : AngScope: Tiện ích bổ sung cho Firefox (Không phải là tiện ích mở rộng chính thức của AngularJS Team)

3. Gỡ lỗi AngularJS : Kiểm tra liên kết: Gỡ lỗi AngularJS


1
xấu hổ nó không thực sự hoạt động. Tôi ước anh chàng sẽ bắt đầu duy trì mọi thứ vì đó là một ý tưởng tuyệt vời và có rất nhiều tiềm năng
Tules 12/04

5
@AskQuestion Có vẻ như Batarang không còn được hỗ trợ. Câu trả lời này cần được loại bỏ
Aakil Fernandes

Nhóm Angular (chủ yếu là @btford) vẫn hỗ trợ Batarang, nhưng nó dường như không được ưu tiên trong danh sách của họ, vì tất cả họ đều hướng đến bản phát hành AngularJS 2.0 tiếp theo. Nhìn vào ng-inspectnếu Batarang đang làm bạn đau đầu.
demisx

giả sử rằng batarang đang hoạt động bình thường, không có ngữ cảnh bổ sung nào được thêm vào các lỗi angle.js trong bảng điều khiển và tab 'AngularJS' cũng không giúp được gì.
user3338098

1
@SazzadTusharKhan: được rồi. Hãy thử điều này -> trên phiên bản mac, bạn có menu Nhà phát triển ("Develop"), trên mac menu này được hiển thị qua tùy chọn> nâng cao> hiển thị menu phát triển và ở đó bạn có thể xem các mục như "Bắt đầu gỡ lỗi javascript". Để bạn tham khảo: youtube.com/watch?v=BUvsnDhFL2w
Vaibhav Jain

35

IMHO, trải nghiệm khó chịu nhất đến từ việc lấy / đặt giá trị của một phạm vi cụ thể liên quan đến yếu tố hình ảnh. Tôi đã thực hiện rất nhiều breakpoint không chỉ trong mã của riêng mình mà còn trong chính bản thân angle.js, nhưng đôi khi nó không đơn giản là cách hiệu quả nhất. Mặc dù các phương pháp dưới đây rất hiệu quả, nhưng chúng chắc chắn bị coi là hành vi xấu nếu bạn thực sự sử dụng trong mã sản xuất, vì vậy hãy sử dụng chúng một cách khôn ngoan!

Nhận tham chiếu trong bảng điều khiển từ phần tử hình ảnh

Trong nhiều trình duyệt không phải IE, bạn có thể chọn một phần tử bằng cách nhấp chuột phải vào một phần tử và nhấp vào "Kiểm tra phần tử". Ngoài ra, bạn cũng có thể nhấp vào bất kỳ phần tử nào trong tab Elements trong Chrome chẳng hạn. Phần tử được chọn mới nhất sẽ được lưu trữ trong biến $0trong bảng điều khiển.

Nhận một phạm vi được liên kết với một phần tử

Tùy thuộc vào việc có tồn tại một chỉ thị tạo một phạm vi cô lập hay không, bạn có thể truy xuất phạm vi bằng cách angular.element($0).scope()hoặc angular.element($0).isolateScope()(sử dụng $($0).scope()nếu $ được bật). Đây chính xác là những gì bạn nhận được khi sử dụng phiên bản Batarang mới nhất. Nếu bạn đang thay đổi giá trị trực tiếp, hãy nhớ sử dụng scope.$digest()để phản ánh các thay đổi trên giao diện người dùng.

$ eval là ác

Không nhất thiết để gỡ lỗi. scope.$eval(expression)rất tiện dụng khi bạn muốn nhanh chóng kiểm tra xem một biểu thức có giá trị mong đợi hay không.

Các thành viên nguyên mẫu còn thiếu của phạm vi

Sự khác biệt giữa scope.blascope.$eval('bla')cũ không xem xét các giá trị được kế thừa nguyên mẫu. Sử dụng đoạn mã dưới đây để có toàn bộ bức tranh (bạn không thể thay đổi trực tiếp giá trị, nhưng bạn vẫn có thể sử dụng $eval!)

scopeCopy = function (scope) {
    var a = {}; 
    for (x in scope){ 
        if (scope.hasOwnProperty(x) && 
            x.substring(0,1) !== '$' && 
            x !== 'this') {
            a[x] = angular.copy(scope[x])
        }
    }
    return a
};

scopeEval = function (scope) {
    if (scope.$parent === null) {
        return hoho(scope)
    } else {
        return angular.extend({}, haha(scope.$parent), hoho(scope))
    }
};

Sử dụng nó với scopeEval($($0).scope()).

Bộ điều khiển của tôi ở đâu?

Đôi khi bạn có thể muốn theo dõi các giá trị ngModelkhi bạn đang viết một chỉ thị. Sử dụng $($0).controller('ngModel')và bạn sẽ nhận được để kiểm tra $formatters, $parsers, $modelValue, $viewValue $rendervà tất cả mọi thứ.


13

cũng có $ log mà bạn có thể sử dụng! nó sử dụng bảng điều khiển của bạn theo cách bạn muốn nó hoạt động!

hiển thị lỗi / cảnh báo / thông tin theo cách mà bảng điều khiển của bạn hiển thị cho bạn bình thường!

sử dụng cái này> Tài liệu


Liên kết bị hỏng.
Phục hồi Monica - notmaynard

10

Mặc dù câu hỏi đã được trả lời, nhưng có thể rất thú vị khi nhìn vào ng-tra.


Tôi không thấy AngularJS Batarang hữu ích, ng-trainer có vẻ hoạt động tốt.
Martin Vseticka


7

Thật không may, hầu hết các tiện ích bổ sung và tiện ích mở rộng trình duyệt chỉ hiển thị các giá trị cho bạn nhưng chúng không cho phép bạn chỉnh sửa các biến phạm vi hoặc chạy các hàm góc cạnh. Nếu bạn muốn thay đổi các biến $ scope trong bảng điều khiển trình duyệt (trong tất cả các trình duyệt) thì bạn có thể sử dụng jquery. Nếu bạn tải jQuery trước AngularJS, thì angle.element có thể được chuyển qua một bộ chọn jQuery. Vì vậy, bạn có thể kiểm tra phạm vi của bộ điều khiển với

angular.element('[ng-controller="name of your controller"]').scope()

Ví dụ: Bạn cần thay đổi giá trị của biến $ scope và xem kết quả trong trình duyệt, sau đó chỉ cần nhập vào bảng điều khiển của trình duyệt:

angular.element('[ng-controller="mycontroller"]').scope().var1 = "New Value";
angular.element('[ng-controller="mycontroller"]').scope().$apply();

Bạn có thể thấy các thay đổi trong trình duyệt của mình ngay lập tức. Lý do chúng tôi sử dụng $ apply () là: bất kỳ biến phạm vi nào được cập nhật từ ngữ cảnh góc bên ngoài sẽ không cập nhật ràng buộc nó, Bạn cần chạy chu trình thông báo sau khi cập nhật các giá trị của phạm vi đang sử dụng scope.$apply().

Để quan sát giá trị biến $ scope, bạn chỉ cần gọi biến đó.

Ví dụ: Bạn muốn xem giá trị của $ scope.var1 trong bảng điều khiển web trong Chrome hoặc Firefox, chỉ cần nhập:

angular.element('[ng-controller="mycontroller"]').scope().var1;

Kết quả sẽ được hiển thị trong bảng điều khiển ngay lập tức.


5

Thêm cuộc gọi đến debuggernơi bạn định sử dụng nó.

someFunction(){
  debugger;
}

Trong consoletab công cụ dành cho nhà phát triển web của trình duyệt của bạn, vấn đềangular.reloadWithDebugInfo();

Truy cập hoặc tải lại trang bạn định gỡ lỗi và xem trình gỡ lỗi xuất hiện trong trình duyệt của bạn.


Điều này dường như không thực sự hoạt động bên trong các thành phần vì một số lý do. Bảng điều khiển dường như xác định vị trí điểm ngắt tại điểm thành phần được tạo, nhưng sẽ không hiển thị mã đang thực sự thực thi. Ít nhất là không phải cho tôi. mặc dù bạn có thể xem giá trị của các biến là phạm vi. Nếu ai đó biết cách để trình gỡ lỗi hiển thị mã thực tế đang được thực hiện thông qua lời khuyên sẽ được đánh giá cao.
user1023110

3
var rootEle = document.querySelector("html");
var ele = angular.element(rootEle); 

scope () Chúng ta có thể tìm nạp phạm vi $ từ phần tử (hoặc cha của nó) bằng cách sử dụng phương thức scope () trên phần tử:

var scope = ele.scope();

kim phun ()

var injector = ele.injector();

Với bộ tiêm này, sau đó chúng tôi có thể khởi tạo bất kỳ đối tượng Angular nào bên trong ứng dụng của chúng tôi, chẳng hạn như dịch vụ, bộ điều khiển khác hoặc bất kỳ đối tượng nào khác


Cảm ơn. Đúng thứ tôi cần!
marlar

2

Bạn có thể thêm 'trình gỡ lỗi' vào mã của mình và tải lại ứng dụng, điều này sẽ đặt điểm ngắt ở đó và bạn có thể 'bước qua' hoặc chạy.

var service = {
user_id: null,
getCurrentUser: function() {
  debugger; // Set the debugger inside 
            // this function
  return service.user_id;
}

2

Bạn có thể gỡ lỗi bằng các trình duyệt được tích hợp sẵn trong các công cụ dành cho nhà phát triển.

  1. mở công cụ dành cho nhà phát triển trong trình duyệt và chuyển đến tab nguồn.

  2. mở tệp mà bạn muốn gỡ lỗi bằng Ctrl + P và tìm kiếm tên tệp

  3. thêm điểm ngắt trên một dòng bằng cách nhấp vào bên trái của mã.

  4. làm mới trang.

Có rất nhiều plugin để gỡ lỗi bạn có thể tham khảo để sử dụng plugin chrome Gỡ lỗi ứng dụng Angular bằng plugin "Debugger for chrome"


1

Đối với Mã Visual Studio (Không phải Visual Studio), hãy thực hiện Ctrl+ Shift+P

Nhập Debugger cho Chrome vào thanh tìm kiếm, cài đặt và kích hoạt nó.

Trong launch.jsontệp của bạn, hãy thêm cấu hình này:

{
    "version": "0.1.0",
    "configurations": [
        {
            "name": "Launch localhost with sourcemaps",
            "type": "chrome",
            "request": "launch",
            "url": "http://localhost/mypage.html",
            "webRoot": "${workspaceRoot}/app/files",
            "sourceMaps": true
        },
        {
            "name": "Launch index.html (without sourcemaps)",
            "type": "chrome",
            "request": "launch",
            "file": "${workspaceRoot}/index.html"
        },
    ]
}

Bạn phải khởi chạy Chrome có bật gỡ lỗi từ xa để tiện ích mở rộng đính kèm vào nó.

  • các cửa sổ

Right click the Chrome shortcut, and select properties In the "target" field, append --remote-debugging-port=9222 Or in a command prompt, execute /chrome.exe --remote-debugging-port=9222

  • OS X

In a terminal, execute /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222

  • Linux

In a terminal, launch google-chrome --remote-debugging-port=9222

Find More ===>


0

Since the add-ons don't work anymore, the most helpful set of tools I've found is using Visual Studio/IE because you can set breakpoints in your JS and inspect your data that way. Of course Chrome and Firefox have much better dev tools in general. Also, good ol' console.log() has been super helpful!


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.