AngularJS指令功能在ng-repeat内部不起作用

问题描述 投票:1回答:2

我正在做一个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运行。

有人知道了吗?

angularjs ionic-framework angularjs-ng-repeat directive
2个回答
2
投票

您的指令控制器应该像这样传递给链接函数:

link: function (scope, element, attrs,myDirCtrl)

注意:myDirCtrl是一个任意名称,可以称为任何名称


然后您在链接函数内调用指令控制器函数,如下所示:

scope.a = function () {
        myDirCtrl.a();
    }

这里是证明要点的plunk


0
投票

最后,这是由于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创建子作用域,但是这种情况有点微妙,不是吗?

© www.soinside.com 2019 - 2024. All rights reserved.