在指令中覆盖控制器函数是个好主意?

时间:2016-08-18 10:47:55

标签: angularjs

我在控制器中实现了通用功能。当我写一个指令时,最好在指令中扩展那些控制器函数吗?

类似于链接功能中的以下实现。

var superCancel = scope.cancel;
// Overriding the cancel function from the controller
scope.cancel = function() {
  if(element.hasClass('ng-dirty')){
         element.removeClass("ng-dirty");
  }
  // Calling controller cancel
  superCancel();
};

2 个答案:

答案 0 :(得分:1)

如果您的指令html来自<{>} html中的控制器,那么您可以使用$parent代替重写

指令中的

$scope.$parent.cancel(); // only if controller coming as parent

如果控制器不是父母,最好使用servicefactory来实现

Read here了解更多

答案 1 :(得分:0)

最好让指令使用属性来设置父范围值。

例如:

JS

app.directive("setModelApi", function() {
    return {
        require: "ngModel",
        link: function(scope,elem,attrs, ngModelCtrl) {
            scope.$eval(attrs.setModelApi, {$api: ngModelCtrl})
        }
    }
});

在上面的示例中,setModelApi指令评估由set-model-api属性定义的角度表达式,$api公开ngModelController

HTML

<input ng-model="x" set-model-api="xmodel=$api">

<button ng-click="xmodel.$setPristine()">Set Pristine</button>

setModelApi指令将xmodel范围变量设置为ng-model-controller API。

该按钮调用$setPristine API的ng-model-controller方法。

来自文档:

  

$ setPristine();

     

将控件设置为其原始状态。

     

可以调用此方法来删除ng-dirty类并将控件设置为其原始状态(ng-pristine类)。当控件在第一次编译时没有改变时,模型被认为是原始的。

- AngularJS ngModelController API Reference -- $setPristine

通过使用HTML指令属性来定义API附加到的范围变量,不同的输入可以使用该指令,并且连接在HTML中公开。

DEMO on JSFiddle