我有以下代码,我想从控制器函数中的自定义指令接收NG模块值:
getName 函数是我试图获得值时的功能。
'use strict';
angular
.module('app', [])
.controller("Controller", function ($scope) {
$scope.getName = function() {
return $scope.name;
};
})
.controller("EditController", function($scope) {
$scope.editingMode = true;
})
.directive("newName", function ($parse) {
return {
template: 'Write name: <input type="text" ng-model="name">'
};
});
<html ng-app="app">
<head>
<meta charset="utf-8">
<title>Angular</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div ng-controller="Controller">
<h1>Hello, {{ getName() }}</h1>
<div ng-controller="EditController">
<new-name ng-show="editingMode"></new-name>
</div>
</div>
</body>
</html>
有人可以帮我吗?
您的getName()
函数在parent
控制器中,您的子控制器覆盖name
变量(JS原型继承)。
您应该建模绑定(use dot(.) in your bindings
)您的父范围属性,以免被覆盖。您也应该为指令定义restrict type
,并应通过父html传递变量。
这是下面的工作代码:
angular
.module('app', [])
.controller("Controller", function($scope) {
$scope.name = {
n: ''
}
$scope.getName = function() {
return $scope.name.n;
};
})
.controller("EditController", function($scope) {
$scope.editingMode = true;
})
.directive("newName", function($parse) {
return {
restrict: 'E',
scope: {
name: '=',
},
template: 'Write name: <input type="text" ng-model="name">'
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<html ng-app="app">
<head>
<meta charset="utf-8">
<title>Angular</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width">
</head>
<body>
<div ng-controller="Controller">
<h1>Hello, {{ getName()}}</h1>
<div ng-controller="EditController">
<new-name ng-show="editingMode" name="name.n"></new-name>
</div>
</div>
</body>
</html>
进一步建议您的代码中不需要2个控制器,但也足够了,也将解决您的问题。
尝试此
<div ng-controller="Controller">
<h1>Hello, {{ name }} </h1>
<div ng-controller="EditController">
<new-name ng-show="editingMode" name="name"></new-name>
</div>
</div>
angular
.module('app', [])
.controller("Controller", ['$scope' , function ($scope ) {
$scope.getName = function (name) {
return $scope.name = name;
};
}])
.controller("EditController", function ($scope) {
$scope.editingMode = true;
$scope.$watch('name', function (newVal, oldVal) {
$scope.getName(newVal);
});
})
.directive("newName", function () {
return {
transclude :true,
restrict: 'E',
scope: {
name: '=',
},
template: 'Write name: <input type="text" ng-model="name" >'
};
});