Đặt biến phạm vi góc trong đánh dấu


94

Câu hỏi đơn giản: Làm cách nào để đặt giá trị phạm vi trong html để bộ điều khiển của tôi đọc?

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

app.controller('MyController', function($scope) {
  console.log($scope.myVar);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app='app'>
  <div ng-controller="MyController" app-myVar="test">
    {{myVar}}
  </div>
</div>

JSFiddle: http://jsfiddle.net/ncapito/YdQcX/


Bạn có thể tốt hơn nên tạo một chỉ thị để xử lý điều này. Một chỉ thị sẽ đóng gói: (các) tham số, một bộ điều khiển cụ thể cho chỉ thị này và một mẫu cho đánh dấu 'myMap'.
Ian Mercer

Đó thực sự là những gì tôi đã làm ... chỉ gặp một số vấn đề với việc truy cập $ scope.myVar trong bộ điều khiển chỉ thị. Tại sao tôi phải sử dụng đồng hồ trong bộ điều khiển để truy cập các biến phạm vi?
Nix

1
Có lẽ bạn có thể đăng chỉ thị của bạn? Hãy xem "Tìm hiểu về chuyển đổi và phạm vi" tại đây docs.angularjs.org/guide/directive Có thể bạn cần phạm vi: {myVar: '='} và bạn sẽ nói my-var="foo"khi gọi nó. Lưu ý sử dụng gạch nối so với camelCase. Lưu ý: fooở đây được đánh giá , nếu bạn không muốn sử dụng '@' trong định nghĩa phạm vi để truy cập giá trị của thuộc tính.
Ian Mercer

1
@Nix Bạn có thể giải thích lý do tại sao giá trị cần được khởi tạo trong chế độ xem, thay vì trong bộ điều khiển của bạn không? Tôi cho rằng bạn đã biết đó không phải là cách khởi tạo giá trị thông thường (nếu không thì bạn sẽ không hỏi) và những người khác sẽ có thể cung cấp cho bạn câu trả lời tốt hơn nếu họ hiểu trường hợp sử dụng của bạn hơn.
Sean the Bean

1
@SeantheBean, tôi còn trẻ và dại dột ...;) Tôi không biết tại sao tôi cần phải làm điều đó. Tôi có lẽ đang cố gắng hack xung quanh một cái gì đó.
Nix

Câu trả lời:


138

ng-initkhông hoạt động khi bạn đang gán các biến bên trong vòng lặp. Sử dụng {{myVariable=whatever;""}}

Dấu ""chấm dừng biểu thức Angular được đánh giá cho bất kỳ văn bản nào.

Sau đó, bạn có thể chỉ cần gọi {{myVariable}}để xuất ra giá trị biến của mình.

Tôi thấy điều này rất hữu ích khi lặp lại nhiều mảng lồng nhau và tôi muốn giữ thông tin lặp hiện tại của mình trong một biến thay vì truy vấn nó nhiều lần.


1
Mặc dù điều này hoạt động, nó có vẻ khó hiểu. Đó là, thông lệ tốt là {{}}chỉ sử dụng để xuất một biến duy nhất, không phải để gán các biến. Tôi muốn nói rằng stackoverflow.com/a/16799763/814160 là đúng hơn (ít mã JS hơn trong chế độ xem).
Sean the Bean

1
+1 cho @SeantheBean - Tôi đã thử nghiệm điều này. Dường như có vấn đề với bộ điều khiển con và phạm vi gán biến trong đánh dấu. Chỉ thị hoạt động cho mục đích của tôi và dường như là một giải pháp vững chắc.
Paul Carlton

2
Đây dường như không làm việc trong angular2 / 4 - Bindings không thể chứa tập
Demodave

1
@Demodave thay vào đó, bạn nên đặt tất cả các biến bộ điều khiển của mình trong mã Typecript và chỉ sử dụng mẫu để kết nối Typecript với HTML. Mẫu không được chỉ định các biến.
boxmein

80

ngInit có thể giúp khởi tạo các biến.

<div ng-app='app'>
    <div ng-controller="MyController" ng-init="myVar='test'">
        {{myVar}}
    </div>
</div>

ví dụ jsfiddle


3
Cần lưu ý chúng tôi không khuyến khích giải pháp này cho các ứng dụng thực tế (nhưng không thực sự đề nghị một sự thay thế): docs.angularjs.org/guide/dev_guide.mvc.understanding_model
Mike Robinson

Điều này làm việc cho tôi, tuy nhiên, lúc đầu biến vẫn chưa được xác định trong bộ điều khiển. Tôi đã tạo một vòng lặp khoảng thời gian nhỏ: var khoảng = setInterval (function () {if ($ scope.w Anything) {// dostuff clearInterval (khoảng);}}, 10);
roelleor

19

Tạo một chỉ thị được gọi myVarbằng

scope : { myVar: '@' }

và gọi nó như thế này:

<div name="my_map" my-var="Richmond,VA">

Đặc biệt lưu ý tham chiếu trường hợp lạc đà trong chỉ thị cho tên thẻ được gạch nối.

Để biết thêm thông tin, hãy xem "Tìm hiểu về việc bao gồm và phạm vi" tại đây: - http://docs.angularjs.org/guide/directive

Đây là một Fiddle cho thấy cách bạn có thể sao chép các giá trị từ các thuộc tính sang các biến phạm vi theo nhiều cách khác nhau trong một chỉ thị.


Tôi muốn có thể làm nhiều cái var-nick='my' var-nick2='test'. Trừ khi bạn có thể nghĩ ra một cách để thực hiện nó với chỉ thị tôi chỉ sẽ sử dụngng-init
Nix

Bạn có thể bao gồm nhiều thuộc tính trong phạm vi, tất cả những gì bạn cần là một trong số chúng là tên của chỉ thị mà bạn muốn thực thi (hoặc bao gồm cả tên chỉ thị đó trong html). scope: {varNick: '@', varNick2: '@'}
Ian Mercer

Nhưng nó không có khả năng mở rộng? Tôi sẽ phải xác định một chỉ thị cho mỗi biến?
Nix

Không, bạn không cần chỉ thị cho mỗi biến. Hãy nhìn vào câu đố mà tôi đã thêm vào câu trả lời.
Ian Mercer

Xin lỗi, tôi nhớ đọc, ví dụ của bạn là hoàn hảo, thay đổi duy nhất của tôi là phạm vi {'@': '@ "}.
Nix

10

Bạn có thể đặt các giá trị từ html như thế này. Tôi không nghĩ rằng có một giải pháp trực tiếp từ góc cạnh được nêu ra.

 <div style="visibility: hidden;">{{activeTitle='home'}}</div>

7
Tốt đẹp hack ... <div style="display: none">tuy nhiên sẽ giới thiệu .
Roger

3

Bạn có thể sử dụng ng-initnhư hình bên dưới

<div class="TotalForm">
  <label>B/W Print Total</label>
  <div ng-init="{{BWCount=(oMachineAccounts|sumByKey:'BWCOUNT')}}">{{BWCount}}</div>
</div>
<div class="TotalForm">
  <label>Color Print Total</label>
  <div ng-init="{{ColorCount=(oMachineAccounts|sumByKey:'COLORCOUNT')}}">{{ColorCount}}</div>
</div>

và sau đó sử dụng biến phạm vi cục bộ trong các phần khác:

<div>Total: BW: {{BWCount}}</div>
<div>Total: COLOR: {{ColorCount}}</div>

Tôi thích cách tiếp cận này; có vẻ ít hacky hơn. Tuy nhiên, có một điều cần làm rõ là ng-init không cần dấu ngoặc nhọn.
mklbtz

1
$scope.$watch('myVar', function (newValue, oldValue) {
        if (typeof (newValue) !== 'undefined') {
            $scope.someothervar= newValue;
//or get some data
            getData();
        }


    }, true);

Biến khởi tạo sau khi bộ điều khiển, vì vậy bạn cần phải theo dõi nó và khi nó chưa được khởi tạo, hãy sử dụng nó.


0

Tôi thích câu trả lời nhưng tôi nghĩ sẽ tốt hơn nếu bạn tạo một hàm phạm vi toàn cục sẽ cho phép bạn đặt biến phạm vi cần thiết.

Vì vậy, trong globalController, hãy tạo

$scope.setScopeVariable = function(variable, value){
    $scope[variable] = value;
}

và sau đó trong tệp html của bạn gọi nó

{{setScopeVariable('myVar', 'whatever')}}

Sau đó, điều này sẽ cho phép bạn sử dụng $ scope.myVar trong bộ điều khiển tương ứng của bạn


0

Nếu bạn không ở trong vòng lặp, bạn có thể sử dụng ng-init khác mà bạn có thể sử dụng

{{var=foo;""}}

alows "" không hiển thị var của bạn

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.