我正在做一个Ionic应用程序,并在其上创建了我的第一个指令。
该指令已正确加载,但已从模板(HTML)中加载,无法在指令控制器上执行任何功能。
crud_input_fields.html
{{a()}}
crud_input_fields.js
myapp.directive('crudInputFields', function (fieldService) {
return {
restrict: 'E',
replace: true,
templateUrl: '/Content/Mobile/templates/directives/crud/crud_input_fields.html',
scope: {
displayables: '='
},
link: function (scope, element, attrs) {
scope.name = 'crud_input_fields';
scope.a = function () {
console.log('ok');
}
},
controller: function ($scope) {
$scope.a = function () {
console.log('ok');
}
this.a = function() {
console.log('ok');
}
}
}
});
但是,如果我在ui-router
控制器上放置一个函数,则可以正常工作:
myapp.controller('CrudInputController', function ($log, $scope, crudContextService,fieldService, schemaService, offlineSchemaService, statuscolorService) {
$scope.a= function () {
console.log('this works!')
}
}
);
此控制器仅管理一个页面,该页面依次创建调用指令:
<ion-view title="{{title()}}">
<ion-nav-buttons side="left">
<button class="button-icon icon ion-navicon" menu-toggle="left"></button>
</ion-nav-buttons>
<ion-content has-header="true">
<crud-input-fields displayables="displayables"></crud-input-fields>
</ion-content>
</ion-view>
指令代码:
<fieldset ng-repeat="field in displayables">
{{a()}}
</fieldset>
我已经将所有这些不同的选项(此,链接,控制器)用于测试。
[该应用程序使用Ionic,Ripple和Angular 1.3.15运行。
有人知道了吗?
您的指令控制器应该像这样传递给链接函数:
link: function (scope, element, attrs,myDirCtrl)
注意:myDirCtrl
是一个任意名称,可以称为任何名称
然后您在链接函数内调用指令控制器函数,如下所示:
scope.a = function () {
myDirCtrl.a();
}
这里是证明要点的plunk
最后,这是由于html的声明方式:
<fieldset ng-repeat="field in displayables" ng-show="!isFieldHidden(field)">
{{a()}}
</fieldset>
没有工作。
但是,
<fieldset ng-repeat="field in getDisplayables()" ng-show="!isFieldHidden(field)">
{{a()}}
</fieldset>
工作,在其中getDisplayables()fn仅返回displayables:
$scope.getDisplayables= function() {
return $scope.displayables;
}
尽管还是不知道为什么。我确实知道ng-repeat创建子作用域,但是这种情况有点微妙,不是吗?