2016-03-19 15 views
7

Đây là câu hỏi đầu tiên của tôi về SO.

Khi tôi ghép nối một phần tử của một mảng trên phạm vi, thay đổi đó không được phản ánh, khi được thực hiện trong hàm gọi lại của bootbox.js.

trình:

$scope.deleteA = function() { 
    if (confirm("Really delete Item 3?")) { 
     $scope.itemsA.splice(2, 1); 
    } 
} 

Không làm việc:

$scope.deleteB = function() { 
    bootbox.confirm("Really delete Item 3?", function(answer) { 
     if (answer === true) { 
     $scope.itemsB.splice(2, 1); 
     } 
    }); 
} 

tôi chủ yếu quan tâm đến việc tìm hiểu lý do tại sao . Điều này quan trọng hơn đối với tôi hơn là giải pháp lạ mắt.

I created a Plunker to show the effect

+1

trong góc gọi lại hộp khởi động không biết rằng có gì đó thay đổi, đó là lý do tại sao không cập nhật chế độ xem – Grundy

Trả lời

7

Bất kỳ sự thay đổi xảy ra với biến phạm vi góc từ thế giới ouside của góc, không thân mật hệ thống góc tiêu hóa để chạy tiêu hóa chu kỳ để cập nhật ràng buộc.
Trong bootbox góc gọi lại không biết rằng có gì đó thay đổi, đó là lý do tại sao không cập nhật chế độ xem.
Để giải quyết vấn đề này, bạn cần phải khởi chu kỳ tiêu hóa bằng tay bằng cách sử dụng $apply method, hoặc $timeout service, như

bootbox.confirm("Really delete Item 3?", function(answer) { 
    if (answer === true) { 
    $scope.$apply(function(){ 
     $scope.itemsB.splice(2, 1); 
    }); 
    } 
}); 
+0

Xin chào @Grundy. Cảm ơn bạn vì câu trả lời. Tôi thấy, giải pháp này hoạt động, nhưng tôi vẫn không hiểu tại sao góc nhìn 'thấy' các thay đổi được thực hiện, khi chúng được thực hiện trong phạm vi chức năng, nhưng không thấy chúng, khi chúng được thực hiện trong một hàm, cũng được định nghĩa bên trong một hàm phạm vi. Thế giới của Angular dừng ở đâu và tại sao? –

+0

@DannySoul, bởi vì trên mỗi sự kiện của người dùng, như 'click',' change', 'keyup' và v.v. tự động chạy vòng lặp digest loop và xem cập nhật nếu cần, trong trường hợp của bạn - góc không chạy sau khi gọi lại hộp thư đến, và bạn nên chạy nó theo cách thủ công – Grundy

+0

@Grundy, cảm ơn câu trả lời của bạn một lần nữa. Nhưng tôi vẫn không hiểu lắm. Giả sử '$ scope.name' là một String có tên trong đó. Nó được biết đến góc cạnh. Nếu tôi thay đổi giá trị '$ scope.name' từ bên trong một hàm' $ scope.myFunction', nó được phản ánh trong khung nhìn. Nếu tôi thay đổi giá trị từ bên trong một hàm mà tôi định nghĩa bên trong '$ scope.myFunction' (' setTimeout' chẳng hạn) thì nó không được phản ánh. Tại sao góc nhìn có thể nhìn thấy nó trong một trường hợp nhưng không nhìn thấy trong trường hợp khác. Tại sao hàm ** gọi ** lại quan trọng? –

0

phương pháp an toàn này để áp dụng thay đổi phạm vi sẽ sử dụng $timeout dịch vụ.

bootbox.confirm("Really delete Item 3?", function(answer) { 
    if (answer === true) { 
    $timeout($scope.itemsB.splice(2, 1)); 
    } 
}); 

Vì vậy, bạn không cần phải lo lắng về $digest pha và $apply của bạn sẽ là một cuộc gọi cao chồng hãy nhìn vào https://github.com/angular/angular.js/wiki/Anti-Patterns điểm -2.

Đừng làm nếu (! $ Scope. $$ phase) $ scope. $ Apply(), có nghĩa là phạm vi $ $. $ Apply() không đủ cao trong ngăn xếp cuộc gọi.

Các vấn đề liên quan