一尘不染

将值从指令传递到控制器

angularjs

以下是我的html模板:

<div ng-app="dr" ng-controller="testCtrl">
    <test color1="color1" data-method="ctrlFn(msg)"></test>    
</div>

下面是我的代码:

var app = angular.module('dr', []);

app.controller("testCtrl", function($scope) {
    $scope.ctrlFn = function(arg) {        
        alert(arg);
    }

});
app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            fromDirectiveFn: '&method'
        },
        link: function(scope, elm, attrs) {
            //Way One
            scope.hello = "some message";
            scope.fromDirectiveFn(scope.hello);
        }
    }
});

<div ng-app="dr" ng-controller="testCtrl">
    <test color1="color1" data-method="ctrlFn(msg)"></test>    
</div>

为什么我会收到“ 未定义 ”而不是“ 某些消息

下面是一个小提琴 http://jsfiddle.net/j2K7N/27/


阅读 219

收藏
2020-07-04

共1个答案

一尘不染

您的代码几乎是正确的,但是这里有几个问题:

<test color1="color1" data-method="ctrlFn(msg)"></test>

在这里,您ctrlFn()从控制器传递函数,该函数msg带有一个未定义的参数,该参数会导致警报消息带有“未定义”文本。我建议将HTML代码修改为:

<test color1="color1" data-method="ctrlFn"></test>

请注意,我将传递ctrlFn为变量而不是函数。

在您的指令代码中,我更改了范围绑定以=确保ctrlFn它将指向您的控制器功能。这还将在指令的作用域和控制器(父)作用域之间建立双向绑定。然后,该指令的整个JS代码将如下所示:

app.directive('test', function() {
    return {
        restrict: 'E',
        scope: {
            fromDirectiveFn: '=method'
        },
        link: function(scope, elm, attrs) {
            //Way One
            scope.hello = "some message";
            scope.fromDirectiveFn(scope.hello);
        }
    }
});

只需替换为&即可=。工作叉:http :
//jsfiddle.net/L8masomq/

2020-07-04