簡體   English   中英

如何將具有隔離范圍的嵌套指令中的對象傳遞給angular中的父控制器范圍

[英]How to pass an object from a nested directive with isolated scope to parent controller scope in angular

我有一個指令樹視圖,其中包含每個呈現項目的嵌套指令(作為分支)。

在兩個指令的范圍內,我已經聲明了兩個應該與父控制器通信的參數。

filter: '&' //將嵌套指令(branch)中的方法過濾器綁定到樹指令屬性中的方法doSomething(),該屬性綁定到綁定到控制器的html指令。

iobj: '='是應該將范圍對象傳遞給控制器​​的雙向綁定參數。 (但目前不是)

指示:

app.directive('tree', function () {
    return {
        restrict: 'E', 
        replace: true,
        scope: {
            t: '=src',
            filter: '&',
            iobj: '='
        },
        controller: 'treeController',
        template: '<ul><branch ng-repeat="c in t.children" iobj="object" src="c" filter="doSomething()"></branch></ul>'
    };
});

app.directive('branch', function($compile) {

    return {
        restrict: 'E', 
        replace: true, 
        scope: {
            b: '=src',
            filter: '&',
            iobj: '='
        },

        template: '<li><input type="checkbox" ng-click="innerCall()"  ng-hide="visible" /><a>{{ b.name }}</a></li>',
        link: function (scope, element, attrs) {
           var has_children = angular.isArray(scope.b.children);
            scope.visible = has_children;
            if (has_children) {
                element.append('<tree src="b"></tree>');
                $compile(element.contents())(scope);
            }
            element.on('click', function(event) {
                event.stopPropagation();
                if (has_children) {
                    element.toggleClass('collapsed');
                }
            });
            scope.innerCall = function () {
                scope.iobj = scope.b;

                console.log(scope.iobj);
                scope.filter();
            }
        }
    };
});

HTML:

<div ng-controller="treeController">
    <tree src="myList" iobj="object" filter="doSomething()"></tree>

    <a ng-click="clicked()"> link</a>
</div>

控制器:

app.controller("treeController", ['$scope', function($scope) {
    var vm = this;

    $scope.object = {};
    $scope.doSomething = function () {
        var item = $scope.object;
        //alert('call from directive');
        console.log(item);
   }

   $scope.clicked = function () {
       alert('clicked');
   }
...

目前我可以從指令調用函數$scope.doSomething到控制器。 所以我知道我可以從指令訪問控制器范圍。 我無法弄清楚的是如何將一個對象作為參數從指令傳遞回控制器。 當我運行此代碼時, $scope.object始終是一個空對象。

我很感激有關如何解決這個問題的任何幫助或建議。

& directive綁定支持參數傳遞。 舉個例子

scope.filter({message: 'Hello', anotherMessage: 'Good'})

messageanotherMessage成為綁定到指令的表達式中的局部變量:

<tree src="myList" iobj="object" filter="doSomething(anotherMessage, message)"></tree>

這是一個示例plunker ,其中回調參數在模板中設置。

文件明確指出:

通常需要通過表達式將數據從隔離范圍傳遞到父范圍,這可以通過將局部變量名稱和值的映射傳遞到表達式包裝器fn來完成。 例如,如果表達式是increment(amount)那么我們可以通過將localFn稱為localFn({amount: 22})來指定金額值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM