angularjs使用$eval从指令中访问控制器的$作用域

angularjs access $scope of Controller from directive using $eval

本文关键字:访问控制 控制器 访问 作用域 指令 使用 eval angularjs      更新时间:2023-09-26

我试图在指令内访问在我的指令控制器范围内定义的方法

这是指令

的一部分
angular.module('myApp', []).directive('jqmultiselect', function($timeout){
return {
    restrict: 'A',
    scope: { 
        info: '=info',
    },
    link: function (scope, element, attrs, ngModelCtrl) {
        $timeout(function(){
            //simple example
            $(element).click(function(){
                //do something with info
                info = 'test';
                scope.$eval(attrs.customclick);
            });
        });
    }
};
}).controller('MainCtrl', function ($scope, $http, $timeout){
    $scope.myInfo="test";
    $scope.reloadModule = function(info){
        console.log(info);
    };
});

我想做的是通过HTML元素的属性标签在控制器中调用一个名为"reloadModule()"的函数

我的一段HTML代码

<select
    jqmultiselect 
    info="myInfo" 
    customclick="reloadModule(info)">
    <option>1</option>
    <option>2</option>
    <option>3</option>
</select>

更具体的例子在Jsfiddle http://jsfiddle.net/7j3HV/2/

你知道我怎么才能让它显示里面有"更改ok"的警告吗?

您的提琴样品有问题。一个是您缺少的ng-controller声明:

<div ng-app="myApp" ng-controller="MainCtrl">

另一个不完全是和问题,而是"隔离作用域"指令的一个特性,它允许您使用&来包含来自父控制器的方法。

类似:

angular.module('myApp', []).directive('jqmultiselect', function($timeout){
    return {
        restrict: 'A',
        scope: { 
            info: '=info',
            customclick:"&"
        },
...

这允许你在指令中调用方法,就像scope.customclick();

一样简单

关于你的第二个问题,如何从我的指令更新一个变量,这里提琴样例:

scope.$apply(function () {
   scope.info = "change ok";
});

更正后的版本:

http://jsfiddle.net/3J5L4/5/