我在像这样的指令中创建一个新的范围
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>
因此属性标签和主题都传递给新的(创建的)Scope。现在,有趣的是,虽然我能够访问模板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
此外,该指令的链接函数中未定义该值
Edit2:已找到解决方案! 在其他控制器初始化时,tc.currentTopic.uID中的值未填充。这就是为什么表达式{{topic}}工作正常,因为它已经被重新评估,当值发生变化时,几毫秒后。我现在直接通过$ routeParams获取数据。
答案 0 :(得分:1)
指令有孤立的范围。自从你添加了:
scope: {
topic: '=topic',
label: '=label'
},
它创建了一个孤立的范围。
但是,有角度的文件说:
=
或=attr
- 在本地范围属性和通过attr属性的值定义的name的父范围属性之间设置双向绑定。如果未指定attr名称,则假定属性名称与本地名称相同。给定<widget my-attr="parentModel">
和范围的窗口小部件定义:{ localModel:'=myAttr' }
,窗口小部件范围属性localModel将在父范围上反映parentModel
的值。对parentModel
的任何更改都将反映在localModel
中,而localModel中的任何更改都将反映在parentModel
中。
链接here
答案 1 :(得分:0)
首先,如果您在指令的链接功能中运行console.log(scope.label);
(目前您还没有,那么您必须添加它),它是否正在运行值?
其次,看起来您希望指令更改父控制器范围中的值。有时,当你这样做时,你可能会发生奇怪的事情。在this answer中,它建议将控制器中的这些值包装在一个对象中。