将父指令模板中的值传递给子指令

时间:2015-12-07 20:01:44

标签: javascript angularjs

问题:

我试图将ng-repeat中的值传递给child-directive但是当我尝试在指令2中访问我传递的变量时,我得到“undefined”。

以下是我正在尝试的内容的说明。基本上指令1 表示小部件数组,而指令2 表示单个小部件。我试图将ng-repeat循环中的项目传递给我的子指令。

enter image description here

我的尝试:

以下是我的指令1 模板的简化版本:

<li ng-repeat="item in widgets">
    <directive2 item="item"></directive2>
</li>

以下是指令2 的简化版本:

angular.module('directive2').directive(
    ['$compile', '$rootScope',
    function ($compile, $rootScope) {
        return {
        restrict: 'E',
            scope: { item: '=' },
            templateUrl: 'ext-modules/tile/widgetTemplate.html',
            link: function (scope, element, attrs) { 
                console.log(scope.item); // undefined
            }
        };
    }]);

小部件上的ng-repeat会创建两个项目,并且我已验证数据是否存在。该应用程序工作正常,不会抛出错误,但我的console.log返回:undefined。

我的问题:

如何将指令模板的 ng-repeat 中的值传递给子指令?

这是一个小提琴:http://jsfiddle.net/3znEu/112/

3 个答案:

答案 0 :(得分:2)

当您将directive2作为指令名称而非module

时,它可以正常工作

http://jsfiddle.net/3znEu/113/

      'use strict';

       var app = angular.module('myApp', [])
        .controller('myController', ['$scope', function($scope) {
            $scope.greeting = 'Hello World!';
            $scope.widgets = ["111","222","333"]
        }]);

        app.directive('directive1',
            ['$compile', '$rootScope',
            function ($compile, $rootScope) {
                return {
                restrict: 'E',
                    scope: { item: '=' },
                    template: '<div>{{item}}</div>',
                    link: function (scope, element, attrs) { 
                        console.log(scope.item); // undefined
                    }
                };
            }]);

答案 1 :(得分:2)

另一个解决方案提案:

HTML:

<div ng-controller="MyCtrl">
  <directive1></directive1>
</div>

JavaScript的:

angular.module('myApp', [])
  .controller('MyCtrl', ['$scope', function ($scope) {
    $scope.widgets = [
      'a', 'b', 'c', 'd'
    ];
   }])
.directive('directive1', function () {
  return {
    restrict: 'E',
    scope: false,
    template: 
      '<li ng-repeat="item in widgets">' +
        '<directive2 item="item"></directive2>' +
      '</li>'
  }
})
.directive('directive2', ['$compile', '$rootScope',
  function ($compile, $rootScope) {
    return {
      restrict: 'E',
      scope: { item: '=' },
      template: 
        '<div>elem = {{item}}</div>',
      link: function (scope, element, attrs) { 
        console.log(scope.item);
      }
   }
}]);

小提琴:http://jsfiddle.net/masa671/dfn75sp3/

答案 2 :(得分:1)

我稍微修改了你的小提琴手http://jsfiddle.net/3znEu/115/
几乎没有变化 1.为您的指令添加了限制 2.添加了一个模板来渲染项目(仅用于测试和演示)
3.将范围中的项目从“@”更改为“=”

angular.module("myApp").directive("directive1", function(){
return {
restrict: 'E',
scope: {

  item: "="
},
template: "{{item}}"
}
});