2015-02-24 14 views
5

Tôi vừa mới bắt đầu với AngularJS và tôi đang cố gắng chia sẻ dữ liệu giữa hai bộ điều khiển ng (cả hai bộ điều khiển nằm trong cùng một mô-đun ng-app) sử dụng một nhà máy. Dữ liệu (trường nhập HTML) từ controller1 dường như được chia sẻ với controller2 hầu hết các lần; nhưng khi tôi xóa tất cả nội dung của trường nhập, đồng hồ $ dường như không hoạt động! Tôi thấy khó giải thích bằng lời. Ảnh chụp màn hình bên dưới có thể hữu ích.

enter image description here

enter image description here

Dưới đây là mã của tôi:

<!DOCTYPE html> 
<html> 
    <head> 
    <% include ../partials/head %> 
    </head> 

    <body class="container" ng-app='myApp'> 

    <div ng-controller="ctrl1"> 
     <input type="text" ng-model="firstName"> 
     <br> 
     Input is : <strong>{{firstName}}</strong> 
    </div> 

    <div ng-controller="ctrl2"> 
     Input should also be here: {{firstName}} 
    </div> 


    <script> 

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

     myApp.factory('Data', function() { 
      var data = { 
       FirstName: '' 
      } 

      return { 
       getFirstName: function() { 
        return data.FirstName; 
       }, 
       setFirstName: function (x) { 
        data.FirstName = x; 
       } 
      } 
     }); 

     myApp.controller('ctrl1', function ($scope, Data) { 
      $scope.firstName = '' 

      $scope.$watch('firstName', function(newVal){ 
       if(newVal){Data.setFirstName(newVal);} 
      }); 
     }); 

     myApp.controller('ctrl2', function ($scope, Data) { 
      $scope.$watch(function(){return Data.getFirstName();}, function(newVal){ 
       if(newVal){$scope.firstName = newVal;} 
      }); 
     }); 
    </script> 

    </body> 

    <footer> 
     <% include ../partials/footer %> 
    </footer> 
</html> 

Ngoài ra còn có một jsfiddle tôi tìm thấy cho mã này. http://jsfiddle.net/5LL3U/2/

Mọi trợ giúp đều được đánh giá cao. Cảm ơn!

+0

này được dựa trên một ví dụ trong một trong những câu trả lời cũ của tôi và đó là sai. Vì vậy, tôi xin lỗi và sẽ cập nhật nó :) Nó nên sử dụng 'oldValue' và làm:' if (newValue! == oldValue) ' – tasseKATT

+0

Cảm ơn bạn @tasseKATT. Hãy tiếp tục phát huy! chúc mừng :) –

+0

Và cảm ơn vì đã nhận thấy lỗi :) – tasseKATT

Trả lời

2

Bạn cần phải kiểm tra cả hai giá trị mới với giá trị cũ trong trường hợp này. Trong trường hợp newValue trống, nó không gọi nhà máy của bạn và sẽ không đặt giá trị trên biến. : -

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


myApp.factory('Data', function(){ 
    var data = 
     { 
      FirstName: '' 
     }; 

    return { 
     getFirstName: function() { 
      return data.FirstName; 
     }, 
     setFirstName: function (firstName) { 
      data.FirstName = firstName; 
     } 
    }; 
}); 

myApp.controller('FirstCtrl', function($scope, Data) { 

    $scope.firstName = ''; 

    $scope.$watch('firstName', function (newValue,oldValue) { 
     console.log(oldValue+" "+newValue); 
     if (newValue!=oldValue) Data.setFirstName(newValue); 
    }); 
}); 

myApp.controller('SecondCtrl', function($scope, Data){ 

    $scope.$watch(function() { return Data.getFirstName(); }, function (newValue,oldValue) { 
     if (newValue!=oldValue) $scope.firstName = newValue; 
    }); 
}); 

Fiddle: - http://jsfiddle.net/1d1vL1hd/

+0

Đó là một chiếc đồng hồ, vì vậy newValue sẽ luôn khác với oldValue! –

+0

nhưng nếu (newValue) sẽ không gọi Data.setFirstName (newValue) trong trường hợp newValue là null – squiroid

+0

Tình trạng của bạn sẽ luôn trôi qua, vì vậy không cần phải có. Nếu bạn muốn kiểm tra xem giá trị là null hay không xác định, thì điều kiện cần phải được cập nhật. –

2

tình trạng của bạn là sai. Khi trống, newValue là falsy và firstName không được cập nhật.

function (newValue) { 
    if (newValue) Data.setFirstName(newValue); 
}); 

Vì vậy, bạn cần thay đổi hoặc xóa điều kiện của mình.

0

Hãy thử cách này: chỉ cần xóa kiểm tra if (newValue) khỏi mã của bạn.

demo here

1

$ phạm vi $ đồng hồ ('đối tượng', function (mới, cũ) {} , đúng).

Sự thật ở đây là sự bình đẳng đối tượng ... như chiếc đồng hồ này được kích hoạt luôn thay đổi giá trị

Ngoài ra, để chia sẻ dữ liệu giữa các bộ điều khiển sử dụng một dịch vụ không phải là một nhà máy.

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