【问题标题】:Communication between controllers using "Controller as" syntax使用“Controller as”语法的控制器之间的通信
【发布时间】:2014-05-29 12:54:43
【问题描述】:

正如我在 stackoverflow 上发现的,在 Angular 控制器之间进行通信的正确方法是使用服务。这里很少有主题可以演示如何使用 $scope 来实现。但是,如果我使用“controller as”语法而不使用 $scope,这种方法(使用服务)对我不起作用。 这是我的例子:

HTML

<div ng-app="myapp">
    <div ng-controller="PersonCtrl as person">
        <p>{{ person.name['last'] }}</p>
    </div>
     <div ng-controller="PersonCtrl2 as person2">
         Change name <button type="button" ng-click="person2.changeName()"> To Ted</button>
     </div>
</div>

JS

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

myapp.controller('PersonCtrl', function (myService1) {
    this.name = myService1.newName;
});

myapp.service('myService1', function() {
    this.newName = {'last': 'Bob'};
});


var PersonCtrl2 = function(myService1) {
    this.service = myService1;
};

PersonCtrl2.prototype.changeName = function() {
    alert('a');
    this.service.newName = {'last': 'Ted'};
};

myapp.controller('PersonCtrl2', PersonCtrl2);

小提琴 http://jsfiddle.net/vxQK7/

附: 我也想使用 $watch 来通知更新,但就我现在而言,我只能从 $scope 使用它,而不能使用“this”?

【问题讨论】:

  • 在您的服务中,尝试返回对象 - 您的服务需要提供“服务”。在您的情况下,您所做的只是初始化服务,而不是从中返回任何内容
  • 嗯,我在这里和网上看到的很多例子都没有返回服务中的任何内容,只在工厂中返回,例如这里:stackoverflow.com/questions/16565105/…

标签: javascript angularjs


【解决方案1】:

正如 callmekatootie 所说,您需要在服务中返回某些内容,但您也不需要破坏模型的引用

 this.name = myService1.newName

这将在 this.name 和 service.newName 之间创建一个链接,而不是值,而是实际对象

 this.service.newName = {'last': 'Ted'};

这会破坏另一个控制器所链接的对象并创建一个新的对象,而另一个控制器不知道该对象存在。

解决方案非常简单,如此链接中所述

http://jsfiddle.net/vxQK7/1/

【讨论】:

  • 如果我有一个包含 10-15 个不同变量的大型服务,我应该将所有内容打包为返回值,还是有更优雅的解决方案?
  • 服务应该总是返回包含你想要共享的所有功能的对象,你可以为你的服务提供私有变量,但你需要公开一些 api 供其他人使用,该 api 可以是函数或者在这种情况下是一个变量。构建 api 的方式将取决于您要提供的数据结构和功能。您对更优雅的解决方案有何想法?
  • 嗯,我觉得你把服务和工厂混为一谈,至少我看到的很多服务示例都没有返回任何东西,比如这里:stackoverflow.com/questions/16565105/…
猜你喜欢
  • 2016-09-20
  • 2014-10-08
  • 2012-08-10
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2017-06-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多