Sự khác biệt giữa ng-model và ng-bind


554

Tôi hiện đang học AngularJS và đang gặp khó khăn trong việc hiểu sự khác biệt giữa ng-bindng-model.

Bất cứ ai có thể cho tôi biết chúng khác nhau như thế nào và khi nào nên sử dụng cái này hơn cái kia?

Câu trả lời:


831

ng-bind có ràng buộc dữ liệu một chiều ($ scope -> view). Nó có một phím tắt {{ val }} hiển thị giá trị phạm vi $scope.valđược chèn vào html với valtên biến.

ng-model dự định được đặt bên trong các phần tử biểu mẫu và có ràng buộc dữ liệu hai chiều ($ scope -> view and view -> $ scope), vd <input ng-model="val"/>.


80
Cảm ơn Sẽ là một giả định hợp lý để nói rằng ng-bind chỉ được yêu cầu khi giá trị hiển thị không yêu cầu người dùng nhập liệu. Và, ng-modal sẽ được sử dụng cho các giá trị (<input>). Các tài liệu góc cạnh dường như đề xuất điều này nhưng tôi sau khi hiểu rõ hơn.
lồng tiếng

24
@Marc Trên thực tế ng-bind liên kết nội dung văn bản của phần tử, không phải giá trị của nó. Do đó, nó không thể được sử dụng trong các phần tử <input>.
trogdor

21
@Marc, trong trường hợp đó, chỉ cần sử dụng: <input type = "text" value = "{{prop}}" />
John Kurlak

3
@JakubBarchot {{:: va}} là ràng buộc một lần và không phải là một cách.
Vlad Bezden

2
@Wachburn Đó là một chiều nhưng quan trọng hơn là một lần. Nó dừng xem thay đổi mô hình sau khi mô hình có bất kỳ giá trị. Vì vậy, nó không thể được sử dụng như ràng buộc một chiều nếu chúng ta cần ràng buộc một chiều thông thường.
Ruslan Stelmachenko

141

câu trả lời của tosh đi vào trung tâm của câu hỏi độc đáo. Dưới đây là một số thông tin bổ sung ....

Bộ lọc & định dạng

ng-bindng-modelcả hai đều có khái niệm chuyển đổi dữ liệu trước khi xuất dữ liệu cho người dùng. Cuối cùng, ng-bindsử dụng các bộ lọc , trong khi ng-modelsử dụng các trình định dạng .

bộ lọc (ng-bind)

Với ng-bind, bạn có thể sử dụng bộ lọc để chuyển đổi dữ liệu của mình. Ví dụ,

<div ng-bind="mystring | uppercase"></div>,

hoặc đơn giản hơn:

<div>{{mystring | uppercase}}</div>

Lưu ý rằng đó uppercaselà bộ lọc góc tích hợp , mặc dù bạn cũng có thể xây dựng bộ lọc của riêng mình .

định dạng (ng-model)

Để tạo một trình định dạng mô hình ng, bạn tạo một lệnh thực hiện require: 'ngModel', cho phép lệnh đó có quyền truy cập vào ngModel controller. Ví dụ:

app.directive('myModelFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, controller) {
     controller.$formatters.push(function(value) {
        return value.toUpperCase();
      });
    }
  }
}

Sau đó, một phần của bạn:

<input ngModel="mystring" my-model-formatter />

Điều này về cơ bản là ng-modeltương đương với những gì uppercase bộ lọc đang làm trong ng-bindví dụ trên.


Trình phân tích cú pháp

Bây giờ, nếu bạn có kế hoạch cho phép người dùng thay đổi giá trị mystringthì sao? ng-bindchỉ có một cách ràng buộc, từ mô hình -> xem . Tuy nhiên, ng-modelcó thể liên kết từ chế độ xem -> mô hình có nghĩa là bạn có thể cho phép người dùng thay đổi dữ liệu của mô hình và sử dụng trình phân tích cú pháp, bạn có thể định dạng dữ liệu của người dùng theo cách hợp lý. Đây là những gì trông giống như:

app.directive('myModelFormatter', function() {
  return {
    require: 'ngModel',
    link: function(scope, element, attrs, controller) {
     controller.$parsers.push(function(value) {
        return value.toLowerCase();
      });
    }
  }
}

Chơi với một plunker trực tiếp của các ng-modelví dụ về trình định dạng / trình phân tích cú pháp


Khác gì?

ng-modelcũng có xác nhận tích hợp. Chỉ cần sửa đổi chức năng $parsershoặc $formatterschức năng của bạn để gọi chức năng của ngModelcontroller.$setValidity(validationErrorKey, isValid) .

Angular 1.3 có một mảng trình xác nhận $ mới mà bạn có thể sử dụng để xác thực thay vì$parsershoặc$formatters.

Angular 1.3 cũng có hỗ trợ getter / setter cho ngModel


7
+ 1. Cảm ơn thông tin thêm. Luôn luôn tốt / tuyệt vời khi có câu trả lời nhanh (của Tosh) và sau đó là câu trả lời TẠI SAO & CÁCH chi tiết như của bạn để tìm hiểu / hiểu thêm về các trường hợp lý luận / sử dụng.
redfox05

30

ngModel

Lệnh ngModel liên kết một đầu vào, chọn, textarea (hoặc điều khiển biểu mẫu tùy chỉnh) với một thuộc tính trên phạm vi.

Lệnh này thực thi ở mức ưu tiên 1.

Ví dụ Plunker

JAVASCRIPT

angular.module('inputExample', [])
   .controller('ExampleController', ['$scope', function($scope) {
     $scope.val = '1';
}]);

CSS

.my-input {
    -webkit-transition:all linear 0.5s;
    transition:all linear 0.5s;
    background: transparent;
}
.my-input.ng-invalid {
    color:white;
    background: red;
}

HTML

<p id="inputDescription">
   Update input to see transitions when valid/invalid.
   Integer is a valid value.
</p>
<form name="testForm" ng-controller="ExampleController">
    <input ng-model="val" ng-pattern="/^\d+$/" name="anim" class="my-input"
         aria-describedby="inputDescription" />
</form>

ngModel chịu trách nhiệm:

  • Liên kết khung nhìn vào mô hình, mà các chỉ thị khác như đầu vào, textarea hoặc chọn yêu cầu.
  • Cung cấp hành vi xác nhận (nghĩa là bắt buộc, số, email, url).
  • Giữ trạng thái của điều khiển (hợp lệ / không hợp lệ, bẩn / nguyên sơ, chạm / không chạm, lỗi xác nhận).
  • Đặt các lớp css liên quan trên phần tử (ng-hợp lệ, ng-không hợp lệ, ng-bẩn, ng-nguyên sơ, ng-chạm, ng-không chạm) bao gồm cả hình ảnh động.
  • Đăng ký điều khiển với hình thức cha mẹ của nó.

ngind

Thuộc tính ngBind báo cho Angular thay thế nội dung văn bản của phần tử HTML đã chỉ định bằng giá trị của biểu thức đã cho và cập nhật nội dung văn bản khi giá trị của biểu thức đó thay đổi.

Lệnh này thực thi ở mức ưu tiên 0.

Ví dụ Plunker

JAVASCRIPT

angular.module('bindExample', [])
    .controller('ExampleController', ['$scope', function($scope) {
    $scope.name = 'Whirled';
}]);

HTML

<div ng-controller="ExampleController">
  <label>Enter name: <input type="text" ng-model="name"></label><br>
  Hello <span ng-bind="name"></span>!
</div>

ngBind chịu trách nhiệm:

  • Thay thế nội dung văn bản của phần tử HTML đã chỉ định bằng giá trị của biểu thức đã cho.

Mặc dù tôi đánh giá cao phản hồi thấu đáo này, câu trả lời được chọn trước đó của tôi sẽ vẫn còn vì nó cung cấp vừa đủ thông tin để hiểu sự khác biệt.
lồng tiếng

8

Nếu bạn đang do dự giữa việc sử dụng ng-bindhoặc ng-model, hãy thử trả lời những câu hỏi sau:


Bạn chỉ cần hiển thị dữ liệu?

  • Có: ng-bind (ràng buộc một chiều)

  • Không: ng-model (ràng buộc hai chiều)

Bạn có cần liên kết nội dung văn bản (và không giá trị)?

  • Đúng: ng-bind

  • Không: ng-model (bạn không nên sử dụng ng-bind khi yêu cầu giá trị)

Thẻ của bạn có phải là HTML <input>không?

  • Có: ng-model (bạn không thể sử dụng ng-bind với <input>thẻ)

  • Không: ng-bind


6

mô hình ng

Chỉ thị ng-model trong AngularJS là một trong những thế mạnh lớn nhất để liên kết các biến được sử dụng trong ứng dụng với các thành phần đầu vào. Điều này hoạt động như ràng buộc dữ liệu hai chiều. Nếu bạn muốn hiểu rõ hơn về các ràng buộc hai chiều, bạn có một thành phần đầu vào và giá trị được cập nhật vào trường đó phải được phản ánh trong phần khác của ứng dụng. Giải pháp tốt hơn là liên kết một biến với trường đó và xuất ra biến đó bất cứ nơi nào bạn muốn hiển thị giá trị được cập nhật thông qua ứng dụng.

liên kết

ng-bind hoạt động khác nhiều so với ng-model. ng-bind là một cách liên kết dữ liệu được sử dụng để hiển thị giá trị bên trong thành phần html dưới dạng HTML bên trong. Lệnh này không thể được sử dụng để liên kết với biến mà chỉ với nội dung các phần tử HTML. Nguyên vẹn điều này có thể được sử dụng cùng với ng-model để liên kết thành phần với các thành phần HTML. Lệnh này rất hữu ích để cập nhật các khối như div, span, v.v. với nội dung HTML bên trong.

Ví dụ này sẽ giúp bạn hiểu.


5

angular.module('testApp',[]).controller('testCTRL',function($scope)
                               
{
  
$scope.testingModel = "This is ModelData.If you change textbox data it will reflected here..because model is two way binding reflected in both.";
$scope.testingBind = "This is BindData.You can't change this beacause it is binded with html..In above textBox i tried to use bind, but it is not working because it is one way binding.";            
});
div input{
width:600px;  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<head>Diff b/w model and bind</head>
<body data-ng-app="testApp">
    <div data-ng-controller="testCTRL">
        Model-Data : <input type="text" data-ng-model="testingModel">
        <p>{{testingModel}}</p>
          <input type="text" data-ng-bind="testingBind">
          <p ng-bind="testingBind"></p>
    </div>
</body>


2

ngModel thường sử dụng cho các thẻ đầu vào để liên kết một biến mà chúng ta có thể thay đổi biến từ trang điều khiển và trang html nhưng ngBind sử dụng để hiển thị một biến trong trang html và chúng ta có thể thay đổi biến chỉ từ bộ điều khiển và html chỉ hiển thị biến.


1

Chúng ta có thể sử dụng ng-bind với <p>để hiển thị, chúng ta có thể sử dụng phím tắt cho ng-bind {{model}}, chúng ta không thể sử dụng ng-bind với các điều khiển đầu vào html, nhưng chúng ta có thể sử dụng phím tắt cho ng-bind {{model}}các điều khiển đầu vào html.

<input type="text" ng-model="name" placeholder="Enter Something"/>
<input type="text" value="{{name}}" placeholder="Enter Something"/>
  Hello {{name}}
<p ng-bind="name"</p>
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.