如何在其他控制器AngularJS中观察变量

时间:2017-06-29 18:35:55

标签: javascript angularjs binding components angularjs-components

我有一个名为histogram demo的组件,其中有一个单独的控制器,它有一个名为$scope.selectedElements的变量,我想在主appCtrl控制器中观察这个变量。如果没有$rootScope,我将如何访问此变量?

主要HTML

<html lang="en-US" ng-app="histogram-test" ng-controller="appCtrl">

 <div  class="histogram-container"> <histogram-demo options = "options" data="data"></histogram-demo></div>
 </html>

App.JS

angular
.module('histogram-test')
.config(function ($httpProvider, usSpinnerConfigProvider) {
    $httpProvider.defaults.withCredentials = true;
    usSpinnerConfigProvider.setDefaults({
        // see http://spin.js.org/
        color: 'white',
        radius: 30,
        width: 8,
        length: 16,
        shadow: true,
    });
})
.controller('appCtrl', function ($scope, appConfig, $rootScope, auth, $state) {
/** HERE is where I want to watch $scope.selectedElements in Component.js **/}

Component.JS

angular
.module('histogram-test').component('histogramDemo', {
    bindings: {
        data: "=",
        options: "=",
    },
    templateUrl: templateUrl,
    controller: controller,
    controllerAs: 'vm',
});

function controller($state, $scope) { ...
$scope.selectedElements = []; ...}

1 个答案:

答案 0 :(得分:1)

您可以考虑将方法传递给component,并在您更改selectedElements时从组件中调用该方法。另外,通过使绑定使用<(单向绑定),使您的应用程序更高效,遵循单向数据流。

bindings: {
    data: "<",
    options: "<",
    selectedItemChange: '&'
},

然后你的指令元素看起来像

<histogram-demo 
   options="options" 
   data="data" 
   selected-item-changed="itemChanged(items)">
</histogram-demo>

每当您在控制器组件中更改vm.selectedItems变量时,请调用vm.selectedItemChange({items: vm.selectedItems}),因此histogram-demo组件的使用者将拥有将接收selectedItems数组的方法。< / p>