2013-04-15 22 views
67

Tôi có một biến sẽ được sử dụng bởi một hoặc nhiều Bộ điều khiển, được thay đổi bởi Dịch vụ. Trong trường hợp đó, tôi đã xây dựng một dịch vụ giữ biến này trong bộ nhớ và chia sẻ giữa các bộ điều khiển.Biến ràng buộc từ Dịch vụ/Nhà máy đến Bộ điều khiển

Vấn đề là: Mỗi khi biến đó thay đổi, các biến trong bộ điều khiển không được cập nhật theo thời gian thực.

Tôi tạo Fiddle này để trợ giúp. http://jsfiddle.net/ncyVK/

--- Lưu ý rằng {{countService}} hoặc {{countFactory}} không bao giờ được cập nhật khi tôi tăng giá trị đếm.

Làm cách nào để liên kết biến Service/Factory với $ scope.variable trong Controller? Tôi đang làm gì sai?

Trả lời

115

Bạn không thể ràng buộc biến. Nhưng bạn có thể liên kết các biến hoặc các đối tượng có chứa biến này. Đây là cố định jsfiddle.

Về cơ bản, bạn phải chuyển đến phạm vi nào đó, có thể trả về/hoặc giữ giá trị hiện tại. Ví dụ.

Factory:

app.factory('testFactory', function(){ 
    var countF = 1; 
    return { 
     getCount : function() { 

      return countF; //we need some way to access actual variable value 
     }, 
     incrementCount:function(){ 
      countF++; 
      return countF; 
     } 
    }    
}); 

Bộ điều khiển:

function FactoryCtrl($scope, testService, testFactory) 
{ 
    $scope.countFactory = testFactory.getCount; //passing getter to the view 
    $scope.clickF = function() { 
     $scope.countF = testFactory.incrementCount(); 
    }; 
} 

Xem:

<div ng-controller="FactoryCtrl"> 

    <!-- this is now updated, note how count factory is called --> 
    <p> This is my countFactory variable : {{countFactory()}}</p> 

    <p> This is my updated after click variable : {{countF}}</p> 

    <button ng-click="clickF()" >Factory ++ </button> 
</div> 
+0

Vì vậy, về cơ bản, nhà máy chỉ là một thùng chứa (singleton) dùng chung cho dữ liệu và chức năng trên dữ liệu. Bạn có thể quản lý/đồng bộ hóa dữ liệu theo cách thủ công trong và ngoài phạm vi $? – sambomartin

+1

@sambomartin đúng. Bài viết tuyệt vời [ở đây] (http://fdietz.github.io/recipes-with-angular-js/controllers/sharing-code-between-controllers-using-services.html) – user4815162342

+2

Vì vậy, bằng cách chuyển hàm như testFactory.getCount và không gọi nó, và gọi nó trong giao diện người dùng bạn đã ràng buộc giá trị dịch vụ. Trong khi nếu bạn $ scope.countFactory = testFactory.getCount() bạn sẽ chỉ gọi hàm một lần khi được khởi tạo và không có gì bị ràng buộc? Vì vậy, không được cập nhật sau này nếu giá trị thay đổi? – mtpultz

0

Đó không phải là ý tưởng tốt để ràng buộc bất kỳ dữ liệu từ dịch vụ, nhưng nếu bạn cần nó nữa, tôi đề nghị bạn theo 2 cách sau.

1) Nhận dữ liệu đó không nằm trong dịch vụ của bạn. Lấy dữ liệu bên trong bộ điều khiển của bạn và bạn sẽ không gặp bất kỳ vấn đề nào để ràng buộc nó.

2) Bạn có thể sử dụng tính năng Sự kiện AngularJs.Bạn thậm chí có thể gửi dữ liệu đến thông qua sự kiện đó.

Nếu bạn cần nhiều hơn với ví dụ ở đây là bài viết có thể giúp bạn.

http://www.w3docs.com/snippets/angularjs/bind-value-between-service-and-controller-directive.html

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