指令attr内的callback函数在不同的attr中定义
所以我有这个指令称为, mySave
,这几乎就是这个
app.directive('mySave', function($http) { return function(scope, element, attrs) { element.bind("click", function() { $http.post('/save', scope.data).success(returnedData) { // callback defined on my utils service here // user defined callback here, from my-save-callback perhaps? } }); } });
元素本身看起来像这样
<button my-save my-save-callback="callbackFunctionInController()">save</button>
callbackFunctionInController现在只是
$scope.callbackFunctionInController = function() { alert("callback"); }
当我console.log()
attrs.mySaveCallback
我的保存指令,它只是给了我一个stringcallbackFunctionInController()
,我读的地方 ,我应该parsing这个,这将是好的,所以我试图$parse(attrs.mySaveCallback)
,这让我回到了一些function,但几乎没有我正在寻找,它让我回来
function (a,b){return m(a,b)}
我究竟做错了什么? 这种做法是否从一开始就有缺陷?
所以看起来最好的方法是使用ProLoserbuild议的隔离范围
app.directive('mySave', function($http) { return { scope: { callback: '&mySaveCallback' } link: function(scope, element, attrs) { element.on("click", function() { $http.post('/save', scope.$parent.data).success(returnedData) { // callback defined on my utils service here scope.callback(); // fires alert } }); } } });
将parameter passing给控制器可以做到这一点
[11:28] <revolunet> you have to send named parameters [11:28] <revolunet> eg my-attr="callback(a, b)" [11:29] <revolunet> in the directive: scope.callback({a:xxx, b:yyy})
有很多方法可以解决你在做什么。 你应该知道的第一件事情是,只要DOM元素被模板引擎渲染出来, $http.post()
就会被调用,就是这样。 如果你把它放在一个重复的地方,这个呼叫将会在中继器中的每一个新的项目完成,所以我的猜测是这绝对不是你想要的。 如果是这样,那么你真的不能正确地devise事物,因为DOM本身的存在不应该决定后端的查询。
无论如何,直接回答你的问题; 如果你阅读$ parse中的蹩脚文档,它会返回一个评估expression式。 当你通过传递作用域来执行这个函数时,你传递的作用域上expression式的当前状态将被返回,这意味着你的函数将被执行。
var expression = $parse(attrs.mySave); results = expression($scope); // call on demand when needed expression.assign($scope, 'newValu'); // the major reason to leverage $parse, setting vals
是的,起初有点混淆,但是您必须明白,asynchronous应用程序中$ scope的变化是不断变化的,而且是在您想要确定价值的时候,而不仅仅是如何。 $parse
对于您希望能够分配值的模型的引用更为有用,而不仅仅是读取。
当然,你可能想要阅读创build一个隔离范围或如何$eval()
expression式。
$scope.$eval(attrs.mySave);
您可以使用。$ eval在给定的范围内执行语句
app.directive('mySave', function($http) { return function(scope, element, attrs) { $http.post('/save', scope.data).success(returnedData) { // callback defined on my utils service here // user defined callback here, from my-save-callback perhaps? scope.$eval(attrs.mySaveCallback) } } });
TD: 演示
如果你想在一个指令和一个控制器之间共享数据,你可以使用双向绑定
app.controller('AppController', function ($scope) { $scope.callbackFunctionInController = function() { console.log('do something') }; $scope.$watch('somedata', function(data) { console.log('controller', data); }, true); }); app.directive('mySave', function($http, $parse) { return { scope: { data: '=mySaveData', callback: '&mySaveCallback' //the callback }, link: function(scope, element, attrs) { $http.get('data.json').success(function(data) { console.log('data', data); scope.data = data; scope.callback(); //calling callback, this may not be required }); } }; });
演示: 小提琴
scope: { callback: '&mySaveCallback' }
明确地设置范围可能是一个很好的解决scheme,但是如果您想要覆盖原始范围的其他部分,则不能,因为您刚刚覆盖了该范围。 出于某种原因,我还需要到达范围的其他部分,所以我使用了与ng-click相同的实现。
在HTML中使用我的指令:
<div my-data-table my-source="dataSource" refresh="refresh(data)">
在指令内部(没有明确地设置范围):
var refreshHandler = $parse(attrs.refresh); scope.$apply(function () { refreshHandler( {data : conditions}, scope, { $event: event }); });
有了这个,我可以调用控制器中的函数并将parameter passing给它。
在控制器中:
$scope.refresh= function(data){ console.log(data); }
它正确地打印出条件。
这对我有效
在视图脚本里面
<tag mycallbackattrib="scopemethod">
在指令里面
$scope[attrs.mycallbackattrib](params....);
它被正确地调用,params通过,但也许不是一个最好的“angular度的方式”工作。
你应该使用ng-click
而不是创build你自己的指令。
app.directive('mySave', function($http, $parse) { return { scope: { data: '=mySaveData', callback: '&' //the callback }, link: function(scope, element, attrs) { $http.get('data.json').success(function(data) { console.log('data', data); if (scope.callback()) scope.callback().apply(data); }); } }; });