同一页面上两个不同控制器的Angularjs双向绑定字段[重复]

Posted

技术标签:

【中文标题】同一页面上两个不同控制器的Angularjs双向绑定字段[重复]【英文标题】:Angularjs two-way binding fields of two different controllers on same page [duplicate] 【发布时间】:2016-09-07 11:36:01 【问题描述】:

我创建了这个包含两个控制器的示例页面,并且我正在尝试如何使用双向绑定,以便在用户输入年龄后更新另一个控制器中的 h3 标题。更新年龄后,我不确定如何连接控制器。我正在寻找事件流是 Update ageHolder.age -> Update AgeData -> Update anotherController getCategory 表达式。

使用这两个控制器,我能够触发ageUpdated 事件,但我无法了解如何更新h3 中的文本。

<!DOCTYPE html>
<html ng-app="factoryApp">
<head>
 <meta charset="utf-8" />
 <script src="/scripts/angular.js"></script>
 <script src="/scripts/FactoryApp.js"></script>
</head>
<body>
  <div ng-controller="factoryController as gsc">
   <label>Age:<input type="text" ng-model="gsc.ageHolder.age" ng-model-options=" getterSetter: true "/></label>
  </div>
  <div ng-controller="anotherController as asc">
    <h3>You are  asc.getCategory() .</h3>
  </div>  
</body>
</html>

  var app = angular.module('factoryApp', []);
  app.factory('AgeData', function () 
    return age: 0;
  );
  app.controller('factoryController', function(AgeData)
      var gsc = this, _age = 20;
      gsc.ageHolder = ;
      gsc.ageHolder.age = function (anAge) 
       if (arguments.length)  
        AgeData.age = anAge; 
        AgeData.sendMessage(anAge); 
       
      ;
  );

  app.controller('anotherController', function(AgeData, $scope) 
    console.log('Age is ', AgeData);
    var asc = this;
    var age = AgeData.age;
    $scope.$on('ageUpdated', function() 
      console.log('Age is updated');
      age = AgeData.age;
    );
    asc.getCategory = function() 
      if (age < 5)
         return "Toddler";
      else if (age < 13)
         return "Child";
      else if (age < 20)
         return "Teen";
      else if (age < 30)
         return "Youngster";
      else if (age < 45)
         return "Middle age";
      else if (age < 60)
         return "Mature person"
      else
        return "Senior Person";                  
    
  );

【问题讨论】:

这不是同一个问题。我没有使用 $scope。我使用控制器作为语法,也使用函数语法使用 getCategory 进行更新。 【参考方案1】:

      var app = angular.module('factoryApp', []);
      app.factory('AgeData', function ($rootScope) 
          return 
              age: 0,
              'sendMessage': function (msg) 
                  $rootScope.$broadcast('ageUpdated', msg);
             
         ;
      );

      app.controller('factoryController', function(AgeData)
          var gsc = this;
          gsc.ageHolder = 
              'age': AgeData.age
          ;
          gsc.ageHolder.setAge = function (anAge) 
              if (arguments.length)  
                  AgeData.age = anAge; 
                  AgeData.sendMessage(anAge); 
              
          ;
      );

      app.controller('anotherController', function(AgeData, $scope) 
          console.log('Age is ', AgeData);
          var asc = this;
          var age = AgeData.age;
          $scope.$on('ageUpdated', function() 
              console.log('Age is updated');
              age = AgeData.age;
          );

          asc.getCategory = function() 
              if (age < 5)
                  return "Toddler";
              else if (age < 13)
                  return "Child";
              else if (age < 20)
                  return "Teen";
              else if (age < 30)
                  return "Youngster";
              else if (age < 45)
                  return "Middle age";
              else if (age < 60)
                  return "Mature person"
              else
                  return "Senior Person";                  
              
          );
    <!DOCTYPE html>
    <html ng-app="factoryApp">
    <head>
        <meta charset="utf-8" />
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    </head>
    <body>
        <div ng-controller="factoryController as gsc">
            <label>Age:</label>
            <input type="text" ng-model="gsc.ageHolder.age" ng-model-options="getterSetter: true " ng-change="gsc.ageHolder.setAge(gsc.ageHolder.age)"/>
        </div>
        <div ng-controller="anotherController as asc">
            <h3>You are  asc.getCategory() .</h3>
        </div>  
    </body>
    </html>
    
我认为您在代码中遗漏了一些想法: 您监听了“ageUpdate”事件,但没有触发该事件的函数 您将模型分配给输入文本,但如果输入值更新/更改,您忘记添加观察者。 您错过了工厂的“sendMessage”功能。

请看一下上面的代码,告诉我这是预期的结果吗?

干杯,

【讨论】:

请重新阅读问题。 这也不是答案。您没有添加任何内容。 如果您仔细阅读代码,您会发现我在其中添加了一些内容。请检查这个 plunkr --> plnkr.co/edit/IDT2zA8eiBYUIvvWDBJl?p=preview 我还是不明白你为什么要我编辑这个答案。你检查过plunkr吗?它有效吗?您认为我的回答在哪一部分不正确? 您的代码的问题是您从未在 AgeData Factory 上定义方法 sendMessage,但您尝试从 factoryController 执行它。

以上是关于同一页面上两个不同控制器的Angularjs双向绑定字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章

rails同一页面上不同控制器的两种形式

AngularJS学习第一课

Angularjs双向绑定

AngularJs 学习

一个机器绑两个IP可能存在的问题

在单个页面上制作一个应用程序的多个不同副本(AngularJS)