我在控制器中实现了通用功能。当我写一个指令时,最好在指令中扩展那些控制器函数吗?
类似于链接功能中的以下实现。
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();
};
答案 0 :(得分:1)
如果您的指令html
来自<{>} html
中的控制器,那么您可以使用$parent
代替重写
:
$scope.$parent.cancel(); // only if controller coming as parent
如果控制器不是父母,最好使用service
或factory
来实现
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中公开。