angularjs使用$ eval从指令访问$的范围

时间:2014-05-20 16:58:41

标签: javascript html angularjs

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

这是我的指示

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);
    };
});

我要做的是调用名为" reloadModule()"的函数。在控制器中通过HTML元素的属性标记

我的HTML代码

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

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

你知道怎样才能让它显示警告&#34;改变确定&#34;在里面?

1 个答案:

答案 0 :(得分:0)

您的小提琴样本中存在问题。一个是你遗漏的ng-controller声明:

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

另一个并不完全是问题,而是“隔离范围”的一个特征&#34;指令,允许您使用&包含来自父控制器的方法。

类似的东西:

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

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

一样简单

关于你的第二个问题,如何在我的指令中更新var,fiddle sample

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

以下是更正后的版本:

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