角度调用控制器函数内部指令

时间:2013-08-31 12:15:04

标签: javascript jquery angularjs

我正在制作迷你联系人列表,我正在尝试实现拖放效果。现在我有一个控制器,它从数据库中获取数据,看起来像这样。

Index.controller('cIndex', function($scope, $http) {
    $scope.init = function() {
        $http.get('php/contacts.php').success(function(data) {
            $scope.jsonContactsList = data;
            $scope.jsonContactsDetail = [];
        });
    };
    $scope.init();

    $scope.listdetail = function(index) {
        alert(index);
    };
});

此控制器会在屏幕上添加联系人列表。我希望当我从列表中拖动一个项目并将其放在列表之外时,该项目将从列表中消失,并显示为关于该特定联系人的详细div。

现在我有2个指令,1个产生拖动效果,1个产生拖放效果,它们看起来像这样。

Index.directive('contactListDrag', function() {
    return {
        restrict: 'A',
        link: function(scope, elem, attr) {
            var options = scope.$eval(attr.contactListDrag);
            elem.draggable(options);
        }
    };
});

Index.directive('contactListDrop', function() {
    return {
        restrict: 'A',
        link: function(scope, elem, attr) {
            elem.droppable({accept: '.contact-list-item'});
            elem.bind('drop', function(event, ui) {
                var id = parseInt($(ui.draggable).attr('id'), 10);
                $scope.listdetail(id);
            });
        }
    };
});

现在在控制器内部我有一个名为listdetail的函数,我打算让它将jsonContactsList中的一行更改为jsonContactsDetail,但为了做到这一点,我需要从控制器调用listdetail函数,在droppable中contactListDrop指令。

先谢谢你,丹尼尔!

2 个答案:

答案 0 :(得分:2)

我发现了这个问题,我不得不使用scope.listdetail(id);没有美元符号。

答案 1 :(得分:0)

您的指令中没有

$ scope 。您需要告诉您有关其父级的指示。请查看Angular文档中的了解转换和范围部分:http://docs.angularjs.org/guide/directive

scope: {
    var: '='
}

您还可以范围。$ emit 来自您的指令的事件,并使用 $ scope。$ on 在控制器中监听它 - 我认为这是更好的解决方案,因为您的指令不会绑定到具有特定功能的控制器。