组件通过一个控制器向另一个组件提供数据

时间:2017-07-31 11:00:01

标签: javascript angularjs angular-components

我希望组件dbServerTable在单击dbServerTable模板中的列表项时向dbServerInfoSidebar提供数据,但dbServerInfoSidebar中没有显示任何数据。

(function(angular) {
    'use strict';
    angular.module('SplashDamageApp').component('dbServerTable', {
        templateUrl: 'dbServerTable.html',
        controller: 'AppCtrl',
    });
})(window.angular);



(function(angular) {
    'use strict';
    angular.module('SplashDamageApp').component('dbServerInfoSidebar', {
        templateUrl: 'dbServerInfoSidebar.html',
        controller: 'AppCtrl',
    });
})(window.angular);

他们都共用同一个控制器。

//AppCtrl
    $scope.selectServer = function(item)
    {
        $scope.selectedItem = item;
    }


// dbServerTable.html
<tr data-ng-repeat="item in items | filter:search | orderBy:'name'"  data-ng-click="selectServer(item)">
        <td>{{item.display_name}}</td>
</tr>

//dbServerInfoSidebar.html
<h1>{{selectedItem}}</h1>

当我单击一个列表项时,selectServer()会抓取它所执行的项目,并且应该将它传递给dbServerInfoSidebar.html,但它没有。

有人可以告诉我如何连接这些数据吗?欢迎使用代码示例:)

1 个答案:

答案 0 :(得分:3)

您创建了两个组件,但您希望它们共享AppCtrl控制器的同一个实例。不是这种情况。将创建AppCtrl的两个实例。每个组件一个。在$scope.selectedItem组件中操作dbServerTable不会更改$scope.selectedItemdbServerInfoSidebar的值。

您想要实现的目标可以通过创建将在控制器中注入的服务来完成。在此服务上,您可以设置selectedItem。默认情况下,服务创建为单例。这意味着两个控制器将获得相同的服务实例。这样,当您更改服务中selectedItem的值时,更改将反映在两个组件中。

一个例子:

// The shared service
(function(angular) {
        'use strict';
        angular.module('SplashDamageApp').service('DbServerService', function() {
            this.selectedItem  = undefined;

        });
})(window.angular);

// AppCtrl
(function(angular) {
        'use strict';
        angular.module('SplashDamageApp').controller('AppCtrl', ['$scope', 'DbServerService', function($scope, DbServerService) {
            $scope.getSelectedItem = function() {
                return DbServerService.selectedItem;
            }

            $scope.setSelectedItem = function(item) {
                DbServerService.selectedItem = item;
            }

        });
}])(window.angular);


// dbServerTable.html
<tr data-ng-repeat="item in items | filter:search | orderBy:'name'"  data-ng-click="setSelectedItem(item)">
    <td>{{item.display_name}}</td>
</tr>

//dbServerInfoSidebar.html
<h1>{{getSelectedItem()}}</h1>