2013-07-22 33 views
10

Tôi đã sử dụng Angular gần đây như một bài tập học tập.Góc: Cung cấp các phương pháp để ng-model

Tôi muốn chuyển một phương thức tới ng-model hoặc một biểu thức có thể đánh giá thành một.

Trong fiddle http://jsfiddle.net/C4aGk/ bạn sẽ thấy rằng tôi đã mã hóa trường cứng là ng-model="record.inner[0].text" và nó hoạt động, bây giờ, tôi muốn thay thế số không mã hóa cứng bằng thứ được trả về lúc chạy- thời gian, được chọn theo tiêu chí cho biết id = 1.

mã HTML của tôi:

<div ng-controller="MainController" ng-app> 
    <div ng-repeat="record in records"> 
     <input ng-model="record.inner[0].text"> <span>{{record.outer}}</span> 
     <div ng-repeat="nested in record.inner">{{nested.id}} - {{nested.text}}</div> 
     <hr /> 
    </div> 
</div> 
<br/> 

và js tương ứng:

function MainController($scope) { 
    $scope.records = [{ 
     outer: "Hello", 
     inner: [{ 
      id: 1, 
      text: "Angular" 
     }, { 
      id: 2, 
      text: "jQuery" 
     }] 
    }, { 
     outer: "World", 
     inner: [{ 
      id: 1, 
      text: "Node.js" 
     }, { 
      id: 2, 
      text: "Underscore.js" 
     }] 
    }]; 

    $scope.getText = function (record) { 
     var index = 0; 
     for (nested in record.inner) { 
      if (nested.id === 1) { 
       return "record.inner[" + index + "].text"; 
      } 
      index++; 
     } 
    }; 

Tôi đã thử đặt ng-model="getText(record)" theo https://groups.google.com/forum/#!topic/angular/Pef6LY2rT7g không thành công, và tìm kiếm khác bật lên https://github.com/angular/angular.js/pull/1328 này mà cũng không kém phần vô ích với tôi.

Mọi trợ giúp sẽ được đánh giá cao.

+2

Bạn đã gặp lỗi trong hàm 'getText'. Các vòng lặp 'for/in' không hoạt động như thế trong JavaScript. Bạn cần thay đổi câu lệnh if thành 'if (record.inner [nested] .id === 1) {'. Dù bằng cách nào, điều đó sẽ không khắc phục được toàn bộ vấn đề của bạn. Nó có thể là tốt hơn để mô tả những gì bạn đang cố gắng làm và không phải là cách bạn đang cố gắng để làm điều đó. Ví dụ: nếu bạn chỉ đang cố gắng để người dùng chỉnh sửa [0] hoặc [1] sau khi nhấp vào nút Chỉnh sửa, thì sẽ tốt hơn/dễ dàng hơn trong Góc để có các trường riêng biệt mà bạn hiển thị/ẩn. – Langdon

+0

Cảm ơn bạn @Langdon vì đã mắc lỗi, tôi thường tránh các vòng lặp 'for/in' vì vậy tôi hơi bị gỉ. Tôi đang theo hướng dẫn của Dan Wahlin đến Angular JS và tôi đang cố gắng làm lại ứng dụng của khách hàng được tham chiếu trong bản trình bày khi nó xảy ra với tôi để thử điều này và vì nó cần phải làm việc theo các liên kết tôi trích dẫn. Tôi nghĩ rằng nó phải là một cái gì đó tôi đang làm sai. Tôi chỉ khám phá các chỉ thị vào lúc này, đó là câu hỏi đặt ra. :) – adeelx

Trả lời

11

Mọi thứ bạn chuyển vào mô hình ng được đánh giá là biểu thức góc đối với phạm vi. Điều đó có nghĩa là record.inner[0].text được đánh giá là $scope.record.inner[0].text và sau đó kết quả của biểu thức đó được sử dụng. Khi bạn sử dụng getText(record), đánh giá góc $scope.getText(record) và ng-model được quyền truy cập vào kết quả của đánh giá này. Hãy nhớ rằng mô hình ng không đánh giá kết quả của cuộc gọi hàm này.

Vấn đề của bạn là bạn đang trả lại kết quả dưới dạng chuỗi biểu thức góc, nhưng không bao giờ đánh giá nó, do đó, mô hình ng được gán một chuỗi mà nó không thể sử dụng. Có rất nhiều cách để thiết kế lại mã của bạn để giải quyết vấn đề này, nhưng cách đơn giản (và có lẽ không tốt nhất) là sử dụng cái gì đó như ng-init để nhận kết quả của cuộc gọi hàm và sau đó chèn kết quả đó vào mô hình. Xem fiddle này để có ví dụ nhanh http://jsfiddle.net/z5z9s/

+2

Tôi không nghĩ 'ng-model =" {{scopeFunctionThatReturnsAString()}} "' được cho là hoạt động. Bạn có một ví dụ về nó? – Langdon

+0

@Langdon Bạn đúng. Cảm ơn vì đã bắt được điều đó! Tôi sẽ sửa câu trả lời của tôi. – Jon7

+0

Cảm ơn bạn đã giải pháp, tôi có thể chỉ cần đi với điều này nếu không có gì tốt hơn là có sẵn. Nếu bạn không bận tâm giải thích, tài liệu Angular nói 'ngModel - {string} - Biểu thức góc có thể gán cho dữ liệu liên kết với '', điều này có nghĩa gì nếu không phải những gì tôi đã làm? Tôi đã không thể có được bất kỳ chức năng để làm việc trong chỉ thị 'ng-model' ở tất cả. – adeelx

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