2012-12-29 31 views
9

AngularJS docs say:AngularJS hứa

$ q lời hứa được công nhận bởi các công cụ khuôn mẫu trong góc, có nghĩa là trong các mẫu bạn có thể đối xử với những lời hứa gắn liền với một phạm vi như thể chúng là các giá trị kết quả.

Vì vậy, ai đó có thể vui lòng giải thích lý do này fiddle không hoạt động? Không thể thay đổi giá trị trường văn bản. Nhưng gán lời hứa rằng dịch vụ $ http trả về một lĩnh vực phạm vi hoạt động giống như một sự quyến rũ.

Bộ điều khiển:

function MyController($scope, $q, $timeout) { 
    this.getItem = function() { 
     var deferred = $q.defer(); 
     deferred.resolve({ 
      title: 'Some title' 
     }); 
     return deferred.promise; 
    }; 

    $scope.item = this.getItem(); 
} 

Html:

<input type="text" ng-model="item.title"> 
+0

Bạn có thể chỉ cho tôi cách bạn chỉ định lời hứa trả về $ http đã hoạt động theo cách bạn muốn không? – Dogbert

+0

@ Dogbert, Đây là mã giả để minh họa những gì tôi đã nói về: '$ scope.item = $ http ({phương thức: 'post', url: '/ find/my/item /'}) .then (chức năng (phản hồi) { trả về trả lời.item; }); ' Một ví dụ khác sử dụng phương pháp tiếp cận tài nguyên $ có thể được tìm thấy trong [hướng dẫn] này (http://docs.angularjs.org/tutorial/step_11). Bắt đầu từ dòng: 'Lưu ý cách thức trong PhoneListCtrl chúng tôi đã thay thế ... bằng $ scope.phones = Phone.query();' –

+0

Rất tiếc, vừa tạo [ví dụ kiểm tra] (http://plnkr.co/edit/ VP1Td3WtdM0E7n5HJH3W? P = xem trước), và nó xuất hiện không hoạt động với bất kỳ lời hứa –

Trả lời

14

Bạn cần phải sử dụng sau đó() chức năng trên đối tượng lời hứa:

this.getItem().then(function(result) { 
    $scope.item = result; 
}); 

Trong trường hợp của bạn Tôi không nghĩ bạn cần một người chuyên nghiệp mise. Hệ thống đồng hồ $ của Angular sẽ chăm sóc mọi thứ. Just return an object in your function, not a primitive type:

this.getItem = function() { 
    var item = {}; 

    // do some async stuff 
    $http.get(...).success(function(result) { 
     item.title = result; 
    }); 
    return item; 
}; 

$scope.item = this.getItem(); 
+0

Tôi biết ý của bạn là gì. Tôi đã cập nhật câu trả lời của mình. Bạn phải để cho góc chăm sóc của nó (nó sẽ làm điều đó tự động với hệ thống đồng hồ $ của nó). – asgoth

+0

Ví dụ thứ hai bạn đưa ra không đơn giản hơn cái đầu tiên;) Bên cạnh đó, nó sẽ không hoạt động như mong đợi, bởi vì $ http.get() sẽ được giải quyết với json đại diện _item_, không chỉ _title_ Vì vậy, ' this.getItem(). sau đó (hàm (kết quả) { $ scope.item = result; }); 'trông khá chấp nhận được (tôi vừa thay đổi this.item = result thành $ scope.item = result) –

+0

Ah, quả thật vậy rằng điều này cần phải có phạm vi. Tôi sẽ thay đổi nó để bạn có thể chấp nhận nó. – asgoth

1

Tôi tin rằng lý do fiddle đầu tiên của bạn không hoạt động là bởi vì bạn là chủ yếu ràng buộc phạm vi tài sản item đến một lời hứa. Khi bạn cố gắng thay đổi giá trị bằng cách nhập vào trường văn bản, góc sẽ thông báo hoạt động và sau đó gán lại/đặt lại giá trị item thành kết quả của lời hứa (chưa thay đổi).

Giải pháp do @asgoth đặt/gán giá trị item một lần, khi lời hứa được giải quyết. Không có ràng buộc nào xảy ra ở đây (tức là, item không bị ràng buộc với lời hứa), vì vậy việc thay đổi giá trị thông qua hộp văn bản sẽ thay đổi giá trị.

-1

Giống như @Mark cho biết, tại đây bạn có thể tìm thấy Working Example đoạn mã của mình.

Về cơ bản bạn đã trả lại một đối tượng và không ràng buộc chính mô hình đó.

$timeout(function(){ 
    $scope.item = { 
     title: 'Some title' 
    }; // Apply the binding 
    deferred.resolve(); // Resolve promise 
},2000); // wait 2 secs   
+0

Dòng cuối cùng của JavaScript của bạn có lẽ chỉ đơn giản là 'this.getItem();'. –

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