2015-03-03 197 views
2

我有一个指令,呈现一个长列表。渲染工作相当精细和快速,现在我想用参数调用控制器上的函数。 我怎样才能做到这一点?Angularjs指令呼叫控制器功能

这里是我的指令:

.directive("slheats", function() { 
return { 
    restrict: "A", 
    scope: { 
     slheats: "=", 
    }, 
    link: function (scope, element, attrs) { 
     scope.$watch("slheats", function (data) { 
      angular.forEach(data, function (heat, h) { 
       var body = ""; 
       var first = true; 
       var ct = 1; 
       body += "<div class='row heat'>" + heat.Heat + "</div>"; 
       angular.forEach(heat.Entries, function (entry, e) { 
        var line = ""; 
        ct++; 

        line += "<div class='name'><button ng-click='showdetails()'>" + entry.Name + "</button></div>"; 

        body += line; 
       }); 
       $(element).append(body); 
      }); 
     }); 
    } 
} 

})

.controller('startlistcontroller',['$scope', 'apiservice', 'objectservice', function ($scope, apiservice, objectservice) { 
$scope.startlists = []; 
$scope.selected = null; 


$scope.showdetails = function (x) { 
    alert(x); 
}; 

我怎么能说我的控制器的showdetails功能?

谢谢曼纽尔!

回答

3

假设您所指的控制器具有指令的父范围,您需要使用角度的范围函数表达式绑定来绑定函数。参见#8 here。因此,它可能看起来像:

.directive("slheats", function() { 
    return { 
    ... 
    scope: { 
     slheats: "=", 
     internalShowdetails: "&" 
    }, 
    link: function (scope, element, attrs) { 
     .... 
     line += "<div class='name'><button ng-click='internalShowdetails()'>" + entry.Name + "</button></div>"; 
     .... 
    } 
}); 

然后在您的html:

<div slheats="something" internal-show-details="showdetails(a, b, c)"></div> 

序号:http://onehungrymind.com/angularjs-sticky-notes-pt-2-isolated-scope/

更新:

所以上面会按预期工作提供您正在使用指令上的template(Url)属性,但是如果您正在呈现html在你的link函数中,因为OP正在这样做,所以需要首先编译$compile。这是一个plnkr显示如何工作。

+0

我有一个模块与多个控制器和指令,所以我猜父范围应该是相同的或?对不起,我对角度很陌生。不幸的是,它不适用于你的解决方案。我会更新我的问题并添加控制器。 – 2015-03-03 13:40:34

+0

我的意思是控制器是/有父范围的是,无论指令在html中被使用,它都在'ng-controller'指向该控制器的某个元素内。我用你的代码创建了这个[plnkr](http://plnkr.co/edit/0T46Q4oSZ2sLFpDUTowA?p=preview),我只是意识到我不确定你想要怎么处理这个指令。从外观上看,你似乎想以某种方式替换指令(或插入)在'angular.forEach'块中看到的html。你能用一个例子说明它在html中的用法吗? – jsonmurphy 2015-03-03 14:09:43

+0

该指令现在只呈现一长串元素,之所以我为此使用指令,是因为ng-repeat非常慢,当我关闭绑定时速度慢了大约10倍。我现在想要做的是打开一个模态对话框,当你点击其中一个列表项来显示一些细节。当我调用foreach循环中的internalshowdetails方法时,例如它可以工作,但是当我将它插入到DOM中时它不起作用。 – 2015-03-03 14:13:28