从嵌套指令调用控制器$ scope方法

时间:2013-05-21 12:26:01

标签: javascript mvvm angularjs

我有以下指令:

指令1

app.directive('tableDiv', function () {
    return {
        templateUrl: 'js/directives/table-div/table-div.html',
        replace: true,
        scope: {
            table: '=',
        },
        controller: function ($scope, $element, $attrs) {

        },
        link: function postLink(scope, element, attrs) {

        }
    }
});

指令1模板:

    <div data-table-div-row value="row" sizes="table.tbody.sizes" ng-repeat="row in table.tbody.values">
</div>

指令2:

app.directive('tableDivRow', function ($rootScope) {
    return {
        templateUrl: 'js/directives/table-div/table-div-row.html',
        replace: true,
        scope: {value: '=', sizes: '='},
        controller: function ($scope, $element, $attrs) {
            $scope.showInfo = function () {
                $scope.visible = true;
            };

            $scope.hideInfo = function () {
                $scope.visible = false;
            };

            $scope.hasTemplate = function() {
                return ($scope.value.template ? true : false);
            }

        },
        link: function postLink(scope, element, attrs) {
            scope.$watch(function () {
                return scope.visible;
            }, function (value) {
                if (value === true) {
                    $(element).find('div.table-row').addClass('open');
                    $(element).find('div.table-row.edit').removeClass('hidden');
                } else {
                    $(element).find('div.table-row').removeClass('open');
                    $(element).find('div.table-row.edit').addClass('hidden');

                }
            }, true);
        }
    }
});

指令2模板:

<div>
<div class="row-fluid">
    <div class="table-row clearfix">
        <div class="{{sizes.first}} first">{{value.display.first}}</div>
        <div ng-repeat="cell in value.display.cells" class="{{sizes.cells[$index]}}">{{cell}}</div>
        <div class="{{sizes.last}} last regular">
            <div ng-switch on="value.display.last">
                <div ng-switch-when="%editbutton%">
                    <div class="show-info closed" ng-click="showInfo()"></div>
                </div>
                <div ng-switch-default>
                    {{value.display.last}}
                </div>
            </div>
        </div>
    </div>
</div>
<div ng-if="hasTemplate()">
    <ng-include src="value.template"></ng-include>
</div>

在第二个指令模板中,我包含一个基于控制器$ scope模型的动态模板。在该模板和指令模板中,我想从控制器$ scope调用一个函数。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分:0)

<ng-include src="value.template"></ng-include>创建子作用域,这意味着父作用应该在此模板中可用。换句话说,你不应该做任何事情而且它会起作用 - 见这个简单的例子:http://plnkr.co/edit/Es2UL09ASPSTa5Fstzjf?p=preview

答案 1 :(得分:0)

所以,它似乎是在文档中,对我来说还不够明确。在指令声明中我需要添加:method: '&'

    scope: {
        table: '=',
        method: '&'
    },

在我调用该指令的模板中,method html属性最后必须()

<div data-table-div-row method="method()" value="row" sizes="table.tbody.sizes" ng-repeat="row in table.tbody.values"></div>

通过这种方式,该方法可以传递给第二个指令。

答案 2 :(得分:0)

正如@Direvius建议的那样,要从指令中调用控制器作用域中的方法,必须调用方法来传递带参数的对象而不是参数本身:

scope.method({message : "text"});

因此,要从嵌套指令调用控制器方法,必须将参数包装在n个对象中:

scope.method({message : {message : "text"}});

不要忘记宣布&#34;消息&#34;作为嵌套指令模板中的参数和html中的外部指令声明:

<outer-directive outer-method-arg="method(message)"></outer-directive>

也在您的外部模板中:

<inner-directive inner-method-arg="method(message)"></inner-directive>