如何将params传递给指令中的`$ scope`函数

时间:2015-06-16 06:14:27

标签: jquery angularjs

如果我错了,请以正确的方式做事

我正在尝试从Alpha传递TextViewindex名称。它不适用于某些问题。有人可以帮我解决这个问题吗?

这是代码:

item

LIVE DEMO

3 个答案:

答案 0 :(得分:2)

在这种情况下,您应该通过=绑定传递函数引用,否则您将无法使用指令内部的参数运行外部函数。所以改变你的代码,比如:

app.directive("subTitle", function () {

    return {
      replace:true,
      scope:{
        change :'=',
        item : '=',
        index:'='
      },
      template : '<h2>{{item.name}} {{index}}</h2>',
      link : function (scope, element, attrs) {
        var num = scope.index;
        element.on('click', function () {
          scope.change(num, scope.item);
          scope.$apply();
        })
      }
    }

})

请记住,如果你正在运行这样的函数(由DOM事件触发,而不是由Angular触发),框架就不知道你刚刚运行它的事实。因此,您必须在最后触发Angular的摘要循环,因此scope.$apply();

我还修复了对item的敬意,因为它已在scope对象上声明,因此scope.change(num, scope.item)代替scope.change(num, item < / p>

然后在你的模板中声明如下:

<sub-title  item='item' index=$index ng-repeat="item in items" change="changeItem"></sub-title>

以下是工作代码:http://plnkr.co/edit/ECu9n0BS4XSqs1756h0v?p=preview

答案 1 :(得分:1)

您可以使用$ rootScope。$ broadcast来调用控制器的功能

var app = angular.module('myApp', []);

app.controller('main', ["$scope", function($scope) {
  console.log("cotroller")
  $scope.items = [{"name":'one'},{"name":'two'},{"name":'three'}, {"name":'four'},{"name":'five'},{name:'six'}];
  $scope.activeItem = $scope.items[0];
  $scope.queueItems = $scope.items.splice(0,1);

  $scope.changeItem = function (index, item) {
    console.log("change now", index, item.name); //not consoling
  }
$scope.change=function(){
//your logic
}
$rootScope.$broadcast('msgFromDirective',function(evnt,data){
$scope.change(data.Num,data.Item);
});
}]);

指令

app.directive(&#34; subTitle&#34;,function($ rootScope){

return {
  replace:true,
  scope:{
    change :'&',
    item : '=',
    index:'='
  },
  template : '<h2>{{item.name}} {{index}}</h2>',
  link : function (scope, element, attrs) {
    var num = scope.index;
    element.on('click', function () {
  $rootScope.$broadcast('msgFromDirective',{Num:num,Item:item});            
 //  scope.change(num, item); 
    })
  }
}

})

答案 2 :(得分:1)

在没有paranthesis的html传递函数引用中。

<sub-title  item='item' index=$index ng-repeat="item in items" change="changeItem"></sub-title>

因为我们传递了函数引用,scope.change()不会调用函数,而是返回changeItem函数。

scope.change();

以上电话将返回:

function (index, item) {
    console.log("change now", index, item.name); //not consoling
} 

所以你必须先调用检索函数,而不是调用实际的函数。

scope.change()(scope.num, scope.item); // calls changeItem function

选中 PLUNKER ,我已编辑了您的代码。