如何使用AngularJS指令创建此自定义控件?

时间:2013-03-28 14:26:50

标签: angularjs angularjs-directive

我对AngularJS有点新意,我正在尝试根据Zurb Foundation的自定义选择编写自定义选择控件(请参阅此处:http://foundation.zurb.com/docs/components/custom-forms.html

我知道我需要使用指令,但不知道如何实现这一目标。

它必须是可重用的,并且允许迭代传入的任何数组。可能需要用户从下拉列表中选择项目时的回调。

以下是自定义Foundation下拉列表的标记:

    <select name="selectedUIC" style="display:none;"></select>
    <div class="custom dropdown medium" style="background-color:red;">
        <a href="#" class="current custom-select">Please select item</a>
        <a href="#" class="selector custom-select"></a>
        <ul ng-repeat="uic in uics">
            <li class="custom-select" ng-click="selectUIC(uic.Name)">{{uic.Name}}</li>
        </ul>
    </div>

这适用于现在。我可以从这个页面的Ctrl中填充控件。但是,正如您所看到的,每次我想使用自定义下拉控件时,我都必须这样做。

关于如何将这个宝宝变成可重复使用的指令的任何想法?

感谢您的帮助!

克里斯

2 个答案:

答案 0 :(得分:21)

如果您想让您的指令不仅可以在同一页面上重复使用,而且可以在多个AngularJS应用程序中重复使用,那么将它们设置在自己的模块中并将该模块作为依赖项导入应用程序非常方便。

我把Cuong Vo的plnkr放在上面(所以最初的功劳归于他)并用这种方法将它分开。现在这意味着如果你想创建一个新指令,只需将其添加到reusableDirectives.js,所有已经有['reusableDirectives']作为依赖关系的应用程序,就可以使用该新指令而无需添加任何指令额外的js到特定的应用程序。

我还将指令的标记移动到它自己的html模板中,因为它比直接在指令中作为字符串更容易阅读,编辑和维护。

Plnkr Demo

<强> HTML

<zurb-select data-label="{{'Select an option'}}" data-options="names" 
  data-change-callback="callback(value)"></zurb-select>

<强> app.js

// Add reusableDirectives as a dependency in your app
angular.module('angularjs-starter', ['reusableDirectives'])
.controller('MainCtrl', ['$scope', function($scope) {
  $scope.names = [{name: 'Gavin'}, {name: 'Joseph'}, {name: 'Ken'}];
  $scope.callback = function(name) {
    alert(name);
  };
}]);

<强> reusableDirectives.js

angular.module('reusableDirectives', [])
.directive('zurbSelect', [function(){
  return {
    scope: {
      label: '@', // optional
      changeCallback: '&',
      options: '='
    },
    restrict: 'E',
    replace: true, // optional 
    templateUrl: 'zurb-select.html',
    link: function(scope, element, attr) { }
  };
}]);

<强> zurb-select.html

<div class="row">
  <div class="large-12 columns">
    <label>{{label || 'Please select'}}</label>
    <select data-ng-model="zurbOptions.name" data-ng-change="changeCallback({value: zurbOptions.name})" 
       data-ng-options="o.name as o.name for o in options">
    </select>
  </div>
</div>

答案 1 :(得分:4)

这就是你想要的东西吗?

http://plnkr.co/edit/wUHmLP

在上面的示例中,您可以将两个属性参数传递给自定义zurbSelect指令。 Options是具有name属性的select选项对象的列表,clickCallback是控制器范围内可用的函数,您希望指令在用户单击某个部分时调用。

请注意,链接函数中没有代码(这是指令的逻辑通常所在的位置)。我们所做的只是包装一个模板,以便它可以重复使用并接受一些参数。

我们创建了一个隔离的范围,因此该指令不需要依赖父范围。我们将隔离范围绑定到传入的属性参数。'&amp;'表示绑定到调用它的父作用域上的表达式(在我们的例子中是我们控制器中可用的回调函数),'='表示在options属性之间创建双向绑定,因此当它在outter作用域中发生更改时,更改是反映在这里,反之亦然。

我们还将此指令的使用限制为仅仅元素()。您可以将其设置为类,属性等。

有关AngularJs指令指南的更多详细信息非常好:

http://docs.angularjs.org/guide/directive

希望这有帮助。