【问题标题】:component gives data to another component through one controller组件通过一个控制器向另一个组件提供数据
【发布时间】:2018-01-06 22:03:05
【问题描述】:

我希望组件 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,但它没有。

谁能告诉我如何连接这些数据?欢迎使用代码示例:)

【问题讨论】:

    标签: javascript angularjs angular-components


    【解决方案1】:

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

    您想要实现的目标,可以通过创建将注入控制器的服务来完成。在此服务上,您可以设置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>
    

    【讨论】:

    • 感谢您的回复。有什么方法可以让你快速模拟你所描述的代码?
    • 我加了一个简单的例子,希望对你有帮助。
    • 这为我解决了问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多