javascript - 具有嵌套 Controller 和 "controller as"语法的表单

标签 javascript angularjs

我正在尝试通过对某些控件的自定义操作来创建一个超出平均水平的复杂表单。 View 的主 Controller 持有将在最后保存的模型。在这个主 Controller 中,我为每个具有一些特定操作的输入控件设置了一个单独的 Controller 。

这是一个简短的例子,问题是,如果我想实现 UserChoiceCtrl.selectLastUser 功能,我怎么能不使用 $scope 呢?

更一般地说,我如何在子 Controller 中访问主 Controller 中的模型?这在 View 中很容易,但我该如何在 Controller 代码中执行?

@Plunker if you prefer

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

angular.module('myApp')
  .controller('TaskCtrl', [
    function() {
      var viewModel = this;

      // This is injected in controller in real life
      viewModel.users = [
        {login: 'Tom', password: '123'}, 
        {login: 'Stanley', password: '123'}, 
        {login: 'Joe', password: '123'}, 
        {login: 'Katy', password: '123'},
        {login: 'Kate', password: '123'},
        {login: 'Tony', password: '123'}
      ];

      viewModel.task = {
        user: viewModel.users[0],
        description: ''
      };

      viewModel.save = function() {
        alert(angular.toJson(viewModel.task));
      };
    }
  ]);

angular.module('myApp')
  .controller('UserChoiceCtrl', [
    function() {
      var viewModel = this;

      viewModel.selectLastUser = function() {
        // No way to access the task variable @ TaskCtrl ?

        // The following line is working but using $scope
        // $scope.taskCtrl.task.user = $scope.taskCtrl.users[5];
      };
    }
  ]);
body {
  font-family: 'Arial';
}
label,
input,
textarea {
  display: block;
}
label {
  margin-top: 8px;
}
<!DOCTYPE html>
<html data-ng-app="myApp">

<head>
  <script data-require="angular.js@1.4.0" data-semver="1.4.0" src="https://code.angularjs.org/1.4.0/angular.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script src="script.js"></script>
</head>

<body data-ng-controller="TaskCtrl as taskCtrl">
  <h1>New task</h1>
  <form name="taskCtrl.taskForm">
    <label>Description</label>
    <textarea data-ng-model="taskCtrl.task.description"></textarea>
    <div data-ng-controller="UserChoiceCtrl as userChoiceCtrl">
      <label>User</label>
      <select data-ng-model="taskCtrl.task.user" data-ng-options="user as user.login for user in taskCtrl.users"></select>
      <button data-ng-click="userChoiceCtrl.selectLastUser()">Last user of list</button>
    </div>
    <br>
    <button data-ng-click="taskCtrl.save()">Save</button>
  </form>
</body>

</html>

最佳答案

试试这个

<button data-ng-click="userChoiceCtrl.selectLastUser(taskCtrl.task.user)">Last user of list</button>

 viewModel.selectLastUser = function(user) {
        alert(user);
        // No way to access the task variable @ TaskCtrl ?

        // The following line is working but using $scope
        // $scope.taskCtrl.task.user = $scope.taskCtrl.users[5];
   };

关于javascript - 具有嵌套 Controller 和 "controller as"语法的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30850053/

相关文章:

javascript - 在 Altair 绘图点击上运行 javascript

javascript - 使用 Javascript 淡入和淡出 CSS 样式表

angularjs - 将模型与 Controller 分开

javascript - 将脚本 src 标签放在正文顶部 vs 将脚本 src 标签放在正文底部

javascript - 在不使用 html5mode 的情况下使用 AngularJS 解析查询字符串的最佳方法

javascript - Angular 不显示 html 页面

javascript - 在第三个文本框中实时显示两个文本框的内容

javascript - SyntaxError : expected expression, 在运行 angularJs 和 Node 时得到 '<'

javascript - 无法在 Plunker 编辑器中添加 Angular.js 脚本

c# - Curl - 获取包含图像和 css 的页面