AngularJS:控制器中未定义的范围变量
AngularJS: Scope variable undefined within controller
我在这样的指令中创建了一个新范围
controllersModule.directive('uploadBox', function() {
return {
restrict: 'E',
scope: {
topic: '=topic',
label: '=label'
},
templateUrl: '/assets/directives/uploadBox.html'
};});
并像这样使用此指令(值 -label 和 topic- 都是值,它们存储在 JSON 文件中,在两个不同的控制器中)
<upload-box label="lc.getTerm('system_upload')" topic="tc.currentTopic.uID"></upload-box>
所以属性标签和主题都传递给了新的(创建的)范围。现在,有趣的是,虽然我能够访问模板 HTML 文件 (uploadBox.html)
中的两个值
<div ng-controller="DropUploadCtrl">
<button class="btn btn-success" dropzone="dropzoneConfig">
<!-- label is correctly shown -->
{{ label }}
</button>
<!-- this link works fine: Evaluates to something like aaa/54dg54...SHA128-Hash...G4FX-->
<a ng-href="aaa/{{ topic }}">BB</a>
</div>
只能从 DropUploadController 中访问标签值。
controllersModule.controller('DropUploadCtrl', ['$scope',function($scope) {
var that = this;
console.log($scope.label); // this is working fine
console.log($scope.topic); // this is undefined
// some more stuff here
}]);
我知道范围是为特定控制器创建的,您不能在两个控制器之间直接共享范围变量。但是,我认为这不是问题,因为我可以使用标签值。但是,我的代码哪里错了?
非常感谢
编辑:
控制器内 rootScope 的输出
console.log("$scope::>");
console.log($scope.label);
console.log($scope.topic);
console.log("$rootScope::>")
console.log($rootScope.label);
console.log($rootScope.topic);
看起来像这样:
"$scope::>"
"I'm a label"
undefined
"$rootScope::>"
undefined
undefined
此外,该值在指令的link函数中未定义
Edit2:已找到解决方案!
tc.currentTopic.uID 中的值在另一个控制器初始化时未被填充。这就是表达式 {{topic}} 工作正常的原因,因为它在几毫秒后值发生变化时再次被评估。我现在直接通过 $routeParams.
获取数据
首先,如果您在指令的 link 函数中 运行 console.log(scope.label);
(您目前没有,则必须添加)是它得到一个值?
其次,您似乎希望指令更改父控制器范围内的值。有时,当您这样做时,您可能会发生奇怪的事情。在 this answer 中,它建议将控制器中的这些值包装在一个对象中。
指令具有独立的作用域。由于您添加了:
scope: {
topic: '=topic',
label: '=label'
},
它创建了一个独立的范围。
但是,angular 文档说:
=
或 =attr
- 在本地作用域 属性 和父作用域 属性 之间建立双向绑定,名称通过 attr 属性的值定义。如果未指定属性名称,则假定属性名称与本地名称相同。给定范围的 <widget my-attr="parentModel">
和小部件定义:{ localModel:'=myAttr' }
,然后小部件范围 属性 localModel 将在父范围上反映 parentModel
的值。对 parentModel
的任何更改都将反映在 localModel
中,对 localModel 的任何更改都将反映在 parentModel
中。
Link here
我在这样的指令中创建了一个新范围
controllersModule.directive('uploadBox', function() {
return {
restrict: 'E',
scope: {
topic: '=topic',
label: '=label'
},
templateUrl: '/assets/directives/uploadBox.html'
};});
并像这样使用此指令(值 -label 和 topic- 都是值,它们存储在 JSON 文件中,在两个不同的控制器中)
<upload-box label="lc.getTerm('system_upload')" topic="tc.currentTopic.uID"></upload-box>
所以属性标签和主题都传递给了新的(创建的)范围。现在,有趣的是,虽然我能够访问模板 HTML 文件 (uploadBox.html)
中的两个值<div ng-controller="DropUploadCtrl">
<button class="btn btn-success" dropzone="dropzoneConfig">
<!-- label is correctly shown -->
{{ label }}
</button>
<!-- this link works fine: Evaluates to something like aaa/54dg54...SHA128-Hash...G4FX-->
<a ng-href="aaa/{{ topic }}">BB</a>
</div>
只能从 DropUploadController 中访问标签值。
controllersModule.controller('DropUploadCtrl', ['$scope',function($scope) {
var that = this;
console.log($scope.label); // this is working fine
console.log($scope.topic); // this is undefined
// some more stuff here
}]);
我知道范围是为特定控制器创建的,您不能在两个控制器之间直接共享范围变量。但是,我认为这不是问题,因为我可以使用标签值。但是,我的代码哪里错了?
非常感谢
编辑:
控制器内 rootScope 的输出
console.log("$scope::>");
console.log($scope.label);
console.log($scope.topic);
console.log("$rootScope::>")
console.log($rootScope.label);
console.log($rootScope.topic);
看起来像这样:
"$scope::>"
"I'm a label"
undefined
"$rootScope::>"
undefined
undefined
此外,该值在指令的link函数中未定义
Edit2:已找到解决方案! tc.currentTopic.uID 中的值在另一个控制器初始化时未被填充。这就是表达式 {{topic}} 工作正常的原因,因为它在几毫秒后值发生变化时再次被评估。我现在直接通过 $routeParams.
获取数据首先,如果您在指令的 link 函数中 运行 console.log(scope.label);
(您目前没有,则必须添加)是它得到一个值?
其次,您似乎希望指令更改父控制器范围内的值。有时,当您这样做时,您可能会发生奇怪的事情。在 this answer 中,它建议将控制器中的这些值包装在一个对象中。
指令具有独立的作用域。由于您添加了:
scope: {
topic: '=topic',
label: '=label'
},
它创建了一个独立的范围。
但是,angular 文档说:
=
或 =attr
- 在本地作用域 属性 和父作用域 属性 之间建立双向绑定,名称通过 attr 属性的值定义。如果未指定属性名称,则假定属性名称与本地名称相同。给定范围的 <widget my-attr="parentModel">
和小部件定义:{ localModel:'=myAttr' }
,然后小部件范围 属性 localModel 将在父范围上反映 parentModel
的值。对 parentModel
的任何更改都将反映在 localModel
中,对 localModel 的任何更改都将反映在 parentModel
中。
Link here