所以想想我做的是正确的事情。
基本上,我有一个工厂(除其他外)从API获取一些数据基本上是一个大型的JSON类型对象,有大量的东西使用restangular。 然后将其存储在$ scope.cvSkills中。 $ scope.cvSkills在控制器的开头启动。
knowledge.controller('cvedit', function ($scope, cvFactory){
$scope.iAm = "";
$scope.CV = "";
$scope.cvskills= "";
cvFactory.getSkills(function(cvSkills){
$scope.cvskills = cvSkills;
console.log("got " + $scope.cvskills.length);
})
})
我的问题是现在将更新的数据传递给指令,这样我们就可以让d3创建一个漂亮的树。 试过:
knowledge.directive('skillTree', function(){
function link(scope,element, attr){
scope.$watch('attr.cvSkills', function() {
console.log("CVSkills updated " + attr.cvSkills.length);
});
var cvSkills = attr.cvSkills;
console.log("Got this back " + cvSkills.length);
for (var i in cvSkills) {
console.log("ID: " + i + " DATA: " + cvSkills[i])
}
}
return {
link: link,
//scope: { cvskills: '=' },
restrict: 'E'
}
问题是范围监视和传入的数据是cvskills发起的,所以如何让它对更新作出反应?
<skill-tree cv-skills="{{cvskills}}"></skill-tree>
这就是我所说的,所以它应该做出反应,还是我做错了?
答案 0 :(得分:1)
<skill-tree cv-skills="cvskills"></skill-tree>
为此,我们需要对您的指令进行一些更改。
knowledge.directive('skillTree', function()
{
function link(scope)
{
scope.$watch('cvSkills', function (cvSkills) // we're watching the scope's cvSkills not the attribute's
{
console.log("Got this back " + cvSkills.length);
for (var i in cvSkills)
{
console.log("ID: " + i + " DATA: " + cvSkills[i])
}
}, true);
}
return {
link: link,
scope: {
cvSkills: '=' // this was correct, almost
},
restrict: 'E'
}
});
我注意到您尝试将cvSkills
添加到您的范围内,这肯定是一个良好的开端,因为我们需要$watch
而不是元素的属性。