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