在控制器中设置可以通过指令看到的变量
Set variable in controller that can be seen by directive
我想将一些数据从控制器传递给指令,所以先是指令:
.directive('myDirective', function() {
'use strict';
return {
restrict: 'EA',
// templateUrl here
controller: DataController,
link: function(scope, elem, attrs, ctrl) {
var data = ctrl.data,
config = {
data: data,
xkey: 'y',
ykeys: ['a', 'b'],
// ... more code here
};
//.. more irrelevant code
}
};
当我这样放置数据时,效果很好:
nslive.controller('DataController', ['Data', 'socketio', '$routeParams', DataController]);
function DataController(Data, socketio, $routeParams) {
'use strict';
var vm = this;
vm.data = [
{y: '2014', a: 12500, b: 38000}, {y: '2015', a: 10500, b: 27000},
{y: '2016', a: 38640, b: 13545}, {y: '2017', a: 38640, b: 13000}
];
// more code here
}
但是,当我像这样将它放在'.success()'回调函数中时,指令无法看到数据:
nslive.controller('DataController', ['Data', 'socketio', '$routeParams', DataController]);
function DataController(Data, socketio, $routeParams) {
'use strict';
var vm = this;
vm.urlJobname = $routeParams.jobname;
Data
.all(vm.urlJobname)
.success(function(data) {
console.log('I got here!'); // this is shown successfully in the chrome console
vm.data = [
{y: '2014', a: 12500, b: 38000}, {y: '2015', a: 10500, b: 27000},
{y: '2016', a: 38640, b: 13545}, {y: '2017', a: 38640, b: 13000}
];
});
}
我觉得跟变量作用域有关,但是不知道怎么设置这样的全局变量,请指教。谢谢
这是因为在 promise/request returns 成功消息之前编译了指令并且执行了 ink 函数,
所以它会被编译,我建议将你的逻辑包装在一个 $watch 中,并在第一次执行它后清除那个 watch
所以这将是您的 link 函数
function(scope, elem, attrs, ctrl){
scope.clearWatch = scope.$watch(function(){return ctrl.data;},function(newVal){
if(newVal){
//your logic goes here ,, we are sure that ctrl.data has value here
// here we call clearWatch to stop watching on that value
scope.clearWatch();
}
});
}
在指令中:
scope: {
object: '='
}
最佳做法是为指令设置 Controller
而不是将其放入 link
函数中。
在控制器指令中:
$scope.$watch('object', function (){
// do something with data
});
在HTML中:
<my-directive object=objectFromController></my-directive>
在控制器中:
$scope.objectFromController = data;
我想将一些数据从控制器传递给指令,所以先是指令:
.directive('myDirective', function() {
'use strict';
return {
restrict: 'EA',
// templateUrl here
controller: DataController,
link: function(scope, elem, attrs, ctrl) {
var data = ctrl.data,
config = {
data: data,
xkey: 'y',
ykeys: ['a', 'b'],
// ... more code here
};
//.. more irrelevant code
}
};
当我这样放置数据时,效果很好:
nslive.controller('DataController', ['Data', 'socketio', '$routeParams', DataController]);
function DataController(Data, socketio, $routeParams) {
'use strict';
var vm = this;
vm.data = [
{y: '2014', a: 12500, b: 38000}, {y: '2015', a: 10500, b: 27000},
{y: '2016', a: 38640, b: 13545}, {y: '2017', a: 38640, b: 13000}
];
// more code here
}
但是,当我像这样将它放在'.success()'回调函数中时,指令无法看到数据:
nslive.controller('DataController', ['Data', 'socketio', '$routeParams', DataController]);
function DataController(Data, socketio, $routeParams) {
'use strict';
var vm = this;
vm.urlJobname = $routeParams.jobname;
Data
.all(vm.urlJobname)
.success(function(data) {
console.log('I got here!'); // this is shown successfully in the chrome console
vm.data = [
{y: '2014', a: 12500, b: 38000}, {y: '2015', a: 10500, b: 27000},
{y: '2016', a: 38640, b: 13545}, {y: '2017', a: 38640, b: 13000}
];
});
}
我觉得跟变量作用域有关,但是不知道怎么设置这样的全局变量,请指教。谢谢
这是因为在 promise/request returns 成功消息之前编译了指令并且执行了 ink 函数, 所以它会被编译,我建议将你的逻辑包装在一个 $watch 中,并在第一次执行它后清除那个 watch
所以这将是您的 link 函数
function(scope, elem, attrs, ctrl){
scope.clearWatch = scope.$watch(function(){return ctrl.data;},function(newVal){
if(newVal){
//your logic goes here ,, we are sure that ctrl.data has value here
// here we call clearWatch to stop watching on that value
scope.clearWatch();
}
});
}
在指令中:
scope: {
object: '='
}
最佳做法是为指令设置 Controller
而不是将其放入 link
函数中。
在控制器指令中:
$scope.$watch('object', function (){
// do something with data
});
在HTML中:
<my-directive object=objectFromController></my-directive>
在控制器中:
$scope.objectFromController = data;