【问题标题】:Is there a way to interact with controller and scope directly in Angularjs?有没有办法直接在 Angularjs 中与控制器和范围进行交互?
【发布时间】:2012-06-11 00:51:00
【问题描述】:

我已经定义了一个控制器,并且范围中有一些变量。我可以知道是否有办法直接在控制器外部(而不是ng-model)为范围变量赋值?另外,我可以在网页的<script>元素中的某处直接调用控制器的功能(而不是使用ng-click)吗?

谢谢!

干杯, 克里斯

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    Angular 中的控制器定义实际上是一个类而不是一个对象。在 HTML 中引用控制器的每个位置,在编译阶段,angular 都会使用定义的控制器类创建一个新的控制器对象。因此,您可以使用同一个控制器类引用多个范围。

    总是有一个与控制器关联的范围,所有变量都绑定到该范围。您可以通过调用类似的方法访问特定 html 元素的范围

    var scope = angular.element("#myelement").scope();
    //use the scope....
    

    如果您让我们知道您尝试从控制器外部访问范围的原因,那也很好。

    更新

    这是引导选项卡组件...您可以将其用作

    <tab>
    <pane title="tab1"><pane>
    <pane title="tab2"></pane>
    </tabs>
    

    这与http://angularjs.org/ 主页上存在的相同。我刚刚将其更新为在选项卡更改时广播事件。

    var directives = angular.module('myApp.directives', []);
    directives.directive('tabs', function () {
        return {
            restrict:'E',
            transclude:true,
            scope:{},
            controller:function ($scope, $element, $rootScope) {
                var panes = $scope.panes = [];
    
                $scope.select = function (pane) {
                    angular.forEach(panes, function (pane) {
                        pane.selected = false;
                    });
                    pane.selected = true;
                    $rootScope.$broadcast("tabChanged", pane.title);
                }
    
                this.addPane = function (pane) {
                    if (panes.length == 0) $scope.select(pane);
                    panes.push(pane);
                }
            },
            template:'<div class="tabbable">' +
                '<ul class="nav nav-tabs">' +
                '<li ng-repeat="pane in panes" ng-class="{active:pane.selected}">' +
                '<a href="" ng-click="select(pane)">{{pane.title}}</a>' +
                '</li>' +
                '</ul>' +
                '<div class="tab-content" ng-transclude></div>' +
                '</div>',
            replace:true
        };
    });
    directives.directive('pane', function () {
        return {
            require:'^tabs',
            restrict:'E',
            transclude:true,
            scope:{ title:'bind' },
            link:function (scope, element, attrs, tabsCtrl) {
                tabsCtrl.addPane(scope);
            },
            template:'<div class="tab-pane" ng-class="{active: selected}" ng-transclude>' +
                '</div>',
            replace:true
        };
    });
    

    这会在选项卡更改时调度一个事件..

    【讨论】:

    • 基本上我想同时使用 angularjs 和 bootstrap(标签 JavaScript 组件)。我已经实现了 REST 架构,并且希望在用户切换到不同的选项卡窗格时检索资源。所以我需要绑定到选项卡更改事件并调用控制器的函数来从这个宁静的 Web 服务中检索。此外,当从 RESTful Web 服务中检索时,我需要指定一个用户 ID .. 虽然我一开始修复了用户 ID,但不想硬核控制器中的 ID 或 js 文件中的范围。
    • 所以我需要在范围内设置变量(用户ID)并从外部调用控制器的功能(从RESTful Web服务中检索数据)。知道如何实现吗?谢谢!
    • 如果可能的话,我想避免使用自定义指令,因为似乎并非所有浏览器都支持自定义指令。不过谢谢你的想法。
    • 您可以使用不是“元素”组件的组件吗?也许作为一个属性?你的目标浏览器会支持吗?
    • 嗯...必须检查...但感谢您的所有建议。
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2013-05-28
    • 2011-05-19
    相关资源
    最近更新 更多