无法从父范围定位 FormController 实例
Unable to locate FormController instance from parent scope
问题
我正在尝试从其父控制器范围访问 AngularJS FormController 实例(通过在 form
指令上设置 name
属性 创建)。输出为 undefined
.
混乱
但是当我将它登录到控制台时,我可以在 $scope
上看到控制器对象作为 属性。我还可以使用插值指令从模板本身访问对象。
例子
标记如下:
<body ng-controller="FooCtrl">
<form name="FooForm" novalidate>
<input name="bar" required>
</form>
</body>
JavaScript 看起来像:
myAngularApp.controller('FooCtrl', function ($scope) {
console.log($scope.FooForm); // undefined
console.dir($scope); // has FooForm peek-a-booing in there
});
演示
这里是完整的代码:http://plnkr.co/edit/EE7pdBF32B5XRbjZuy8R?p=preview
我做错了什么?我正在尝试遵循这些文档:https://docs.angularjs.org/api/ng/directive/form
这里的问题是你的控制器在你的模板之前被初始化,所以当你试图使用它时,它仍然是未定义的。试试这个:
myApp.controller('MainCtrl', function ($scope) {
$scope.$watch('NewForm', function () {
var outputArea = document.getElementById('output-area');
outputArea.innerHTML = "The FormController instance is: " + $scope.NewForm;
});
});
另请注意使用:
outputArea.innerHTML = "The FormController instance is: " + console.dir(newVal);
没有多大意义,您试图将 console.dir 的 return 值连接到一个字符串,该字符串也总是 return 未定义 ;) 将其更改为:
outputArea.innerHTML = "The FormController instance is: " + $scope.NewForm;
这是一个有效的 Plunker:http://plnkr.co/edit/yfVP8hD6saWV2tIok2ER?p=preview
评论后编辑:
如果您希望在表单在您的范围内可用时立即收到通知并且您不想使用 $watch,您可以通过向您的表单元素添加一个自定义指令来触发一个事件:
<form name="NewForm" novalidate formready>
自定义 'formready' 指令:
.directive('formready', function(){
return {
restrict: 'A',
compile: function () {
return {
post: function(scope) {
scope.$emit('formready');
}
}
}
};
});
现在在你的控制器中你可以做:
$scope.$on('formready', function (event) {
console.log($scope.NewForm); // Available now
});
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/KG7LEB6EEkBkdONkL9LA?p=preview
问题
我正在尝试从其父控制器范围访问 AngularJS FormController 实例(通过在 form
指令上设置 name
属性 创建)。输出为 undefined
.
混乱
但是当我将它登录到控制台时,我可以在 $scope
上看到控制器对象作为 属性。我还可以使用插值指令从模板本身访问对象。
例子
标记如下:
<body ng-controller="FooCtrl">
<form name="FooForm" novalidate>
<input name="bar" required>
</form>
</body>
JavaScript 看起来像:
myAngularApp.controller('FooCtrl', function ($scope) {
console.log($scope.FooForm); // undefined
console.dir($scope); // has FooForm peek-a-booing in there
});
演示
这里是完整的代码:http://plnkr.co/edit/EE7pdBF32B5XRbjZuy8R?p=preview
我做错了什么?我正在尝试遵循这些文档:https://docs.angularjs.org/api/ng/directive/form
这里的问题是你的控制器在你的模板之前被初始化,所以当你试图使用它时,它仍然是未定义的。试试这个:
myApp.controller('MainCtrl', function ($scope) {
$scope.$watch('NewForm', function () {
var outputArea = document.getElementById('output-area');
outputArea.innerHTML = "The FormController instance is: " + $scope.NewForm;
});
});
另请注意使用:
outputArea.innerHTML = "The FormController instance is: " + console.dir(newVal);
没有多大意义,您试图将 console.dir 的 return 值连接到一个字符串,该字符串也总是 return 未定义 ;) 将其更改为:
outputArea.innerHTML = "The FormController instance is: " + $scope.NewForm;
这是一个有效的 Plunker:http://plnkr.co/edit/yfVP8hD6saWV2tIok2ER?p=preview
评论后编辑:
如果您希望在表单在您的范围内可用时立即收到通知并且您不想使用 $watch,您可以通过向您的表单元素添加一个自定义指令来触发一个事件:
<form name="NewForm" novalidate formready>
自定义 'formready' 指令:
.directive('formready', function(){
return {
restrict: 'A',
compile: function () {
return {
post: function(scope) {
scope.$emit('formready');
}
}
}
};
});
现在在你的控制器中你可以做:
$scope.$on('formready', function (event) {
console.log($scope.NewForm); // Available now
});
这是一个关于 Plunker 的工作示例:http://plnkr.co/edit/KG7LEB6EEkBkdONkL9LA?p=preview