无法使Factory,controller和指令之间的数据绑定工作

时间:2016-02-12 16:16:44

标签: angularjs

所以想想我做的是正确的事情。

基本上,我有一个工厂(除其他外)从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>

这就是我所说的,所以它应该做出反应,还是我做错了?

1 个答案:

答案 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而不是元素的属性。