2015-06-11 16 views
10

Tôi đang cố gắng hiểu ng-if và phạm vi. Như tôi biết, ng-nếu tạo ra một phạm vi con mới. Đây là vấn đề của tôi:AngularJS ng-if và phạm vi

Xem

<input ng-model="someValue1" /> 
<div ng-if="!someCondition"> 
    <input ng-model="$parent.someValue2" /> 
</div> 

khiển

$scope.someCondition = true; 

if ($scope.someCondition) { 
    $scope.someValue2 = $scope.someValue1;   
} 

Nếu someCondition được thiết lập là true, sau đó someValue2 nên giống như someValue1.

Vấn đề của tôi là tôi không thể truy cập someValue2 trong cả hai trường hợp (đúng hoặc sai). Làm thế nào tôi có thể đạt được điều này?

+3

Trong góc bạn phải không bao giờ thay đổi $ cha mẹ thuộc tính giá trị trực tiếp.Tuy nhiên, bạn có thể sửa đổi thuộc tính của thuộc tính cha mẹ $ hoặc bạn sẽ phá vỡ kế thừa. do: '$ parent.someValue.num = 10', không:' $ parent.someValue = 10' – Freezystem

Trả lời

-6

Từ những gì tôi biết, ng-if chỉ là tuyên bố mức hiển thị. Bạn có thể sử dụng nó để làm cho một số phần tử có thể nhìn thấy/vô hình cho một số giá trị nhất định nhưng tôi không nghĩ rằng nó tạo ra bất kỳ loại phạm vi nào. Những gì mã HTML của bạn sẽ làm là chuyển đổi khả năng hiển thị của đầu vào thứ cấp của bạn.

Nếu bạn muốn chuyển đổi giá trị của bạn từ 2 đến giá trị bằng 1 bất cứ khi nào "someCondition" thay đổi giữa giả và thật, sau đó bạn có thể sử dụng $ xem có cái gì đó như thế này:

$scope.$watch(someCondition, function(){ 
    if (someCondition){ 
    $scope.someValue1 = $scope.someValue2 
    } 
}) 
+0

Cảm ơn bạn đã bình luận. Tình trạng của tôi là trên phạm vi là tốt, vì vậy tôi không nghĩ rằng tôi cần phải xem nó. –

+0

No. ngNếu khác với ngShow, ngHide ở chỗ nó không chỉ ẩn phần tử html. Nó hoàn toàn phá hủy nó. Và nó thực sự tạo ra một phạm vi mới sử dụng thừa kế prototypal. https://docs.angularjs.org/api/ng/directive/ngNếu – user2734679

+1

@ user2734679 Dude đẹp, cảm ơn bạn đã liên kết! Tôi học một cái gì đó mới về Angular mỗi ngày :-) – FrankieAvocado

7

ngIf không thực sự tạo một phạm vi mới sử dụng thừa kế prototypal. Điều đó có nghĩa là đối tượng nguyên mẫu của phạm vi ngIf là phạm vi cha mẹ của nó. Vì vậy, nếu thuộc tính không được tìm thấy trên ví dụ ngIf của phạm vi của nó, nó sẽ xem xét nó là chuỗi đối tượng nguyên mẫu cho thuộc tính đó. Tuy nhiên, một khi bạn gán một thuộc tính cho thể hiện của phạm vi nó sẽ không còn nhìn vào chuỗi thừa kế của nó cho thuộc tính. Đây là một liên kết giải thích sự thừa kế nguyên mẫu được sử dụng trong JS. https://github.com/angular/angular.js/wiki/Understanding-Scopes#javascript-prototypal-inheritance

Cách giải quyết vấn đề này. điều khiển

phụ huynh:

$scope.data = {someValue: true}; 

điều khiển trẻ em:

$scope.data.someValue = false 

Bởi vì bạn đang không hề giấu giếm một thuộc tính trên phạm vi cha mẹ của nó, bạn chỉ cần biến đổi một đối tượng trên phạm vi các bậc cha mẹ, đây thực sự sẽ thay đổi obj dữ liệu của cha mẹ. Vì vậy, trong trường hợp của bạn.

<input ng-model="data.someValue1" /> 
<div ng-if="!data.someCondition"> 
    <input ng-model="data.someValue2" /> 
</div> 
+0

Tôi sẽ đi sâu vào nó, cảm ơn bạn :) –

+0

user2734679 bạn có thể cho tôi một lời giải thích có lẽ? Với giá trị nhất định của someValue. Thật không may tôi vẫn không nhận được nó. –

+0

Đây không phải là một điều góc cạnh. Đó là một điều javascript. Đây là một số ví dụ về sự thừa kế nguyên mẫu. – user2734679

19

Vâng, ng-if tạo ra một phạm vi con mới

Để xem thuộc tính mô hình trong một ng-if, ngón tay cái rule of-là:

KHÔNG SỬ DỤNG PHẠM VI AS MODEL

ví dụ

ng-if='showStuff' //here my scope is model **INCORRECT** 
ng-if='someObject.showStuff' // ** CORRECT ** 

Sử dụng một tài sản đối tượng trong ng-mô hình - sau đó, ngay cả khi ng-if tạo ra phạm vi con mới, phạm vi phụ huynh sẽ có những thay đổi.

Để xem Plunker làm việc, nhìn ở đây: http://jsfiddle.net/Erk4V/4/

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