javascript - 如何从另一个 Controller 或指令触发 Controller 方法?

标签 javascript angularjs angularjs-directive angularjs-controller

我需要的是当我在另一个 Controller 上处理某些数据时自动显示一些值,但是当controller2 已结束自动处理我的数据。 JS fiddle http://jsfiddle.net/b2fCE/228/

这是HTML代码

<div ng-app="myApp">
    <div ng-controller="myController1">
        <button ng-click="setOnController1()">Force values(SECOND)</button><br/>
        <ul>
            <li><b>myController1</b> (values won't change)</li>
            <li>{{stringValue}}</li>
            <li>{{objectValue}}</li>
        </ul>
    </div>    
    <div ng-controller="myController2">
        <ul>
            <li><b>myController2</b> (values will change when Set Values is clicked or when 2-way binding textbox is modified)</li>
            <li>{{stringValue()}}</li>
            <li>{{objectValue.data}}</li>
        </ul>
        <input type="text" ng-model="newValue"></input>
        <button ng-click="setString(newValue)">Set Values(FIRST)</button><br/>
        <input type="text" ng-model="objectValue.data"></input>2-way binding to objectValue
    </div>
</div>

还有JS

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

app.service('sharedProperties', function() {
    var stringValue = 'test string value';
    var objectValue = {
        data: 'test object value'
    };

    return {
        getString: function() {
            return stringValue;
        },
        setString: function(value) {
            stringValue = value;
        },
        getObject: function() {
            return objectValue;
        }
    }
});

app.controller('myController1', function($scope, sharedProperties) {
    $scope.setOnController1 = function(sharedPoperties){
    $scope.stringValue = sharedProperties.getString();
    $scope.objectValue = sharedProperties.getObject().data;
    }
});

app.controller('myController2', function($scope, sharedProperties) {
    $scope.stringValue = sharedProperties.getString;
    $scope.objectValue = sharedProperties.getObject();
    $scope.setString = function(newValue) {
        $scope.objectValue.data = newValue;
        sharedProperties.setString(newValue);
    //some code to set values on screen at controller1
    };

});

这是 JS FIDDLE

http://jsfiddle.net/b2fCE/228/

最佳答案

有几种不同的方法。一,您可以在 Controller2 上广播事件并在 Controller1 上监听该事件(如 tymeJV 建议的那样)。您需要在 $rootScope 上广播和收听。

app.controller('myController2', function($rootScope, $scope, sharedProperties) {
  $scope.stringValue = sharedProperties.getString;
  $scope.objectValue = sharedProperties.getObject();
  $scope.setString = function(newValue) {
    $scope.objectValue.data = newValue;
    sharedProperties.setString(newValue);
    //some code to set values on screen at controller1
    $rootScope.$broadcast("myEvent");
  };


app.controller('myController1', function($rootScope, $scope, sharedProperties) {
    $scope.setOnController1 = function(sharedPoperties){
        $scope.stringValue = sharedProperties.getString();
        $scope.objectValue = sharedProperties.getObject().data;
    }
    $rootScope.$on("myEvent", function() {
        $scope.setOnController1(sharedProperties);
    });
});

Fiddle演示

同样,您可以在 Controller1 上设置 $watch 来监视服务中的值。

app.controller('myController1', function($rootScope, $scope, sharedProperties) {
    $scope.setOnController1 = function(sharedPoperties){
        $scope.stringValue = sharedProperties.getString();
        $scope.objectValue = sharedProperties.getObject().data;
    }
    $scope.$watch(function(){return sharedProperties.getString()}, function(newValue, oldValue){
        $scope.setOnController1(sharedProperties);
    });

});

Fiddle演示

关于javascript - 如何从另一个 Controller 或指令触发 Controller 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937963/

相关文章:

javascript - 创建 AngularJS 指令来验证模糊

javascript - mobx 商店更改后更新选项卡导航器上的徽章

javascript - setTimeout 和 mouseout 问题

javascript - AngularJS 和 Jasmine : isolateScope() is undefined

javascript - 操作引发事件的 DOM 元素

javascript - 为什么我无法使用 angularjs $http.get() 从服务器获取数据?

javascript - 如何将多个值传递给 Angularjs 指令?

javascript - 如何在同一个 div 中定位 next()

javascript - 如何在孙子组件中设置或更新数组的状态

javascript - 正确的方法 - Angular JS 指令之间的通信