如何将函数变量从控制器传递到指令链接?

时间:2015-07-02 08:50:17

标签: angularjs angularjs-directive

我试图通过指令评估变量。如何将函数内部的变量从控制器传递到指令链接?我能够在全局范围内传递它,但如果在函数内部设置了变量,则表示未定义。我也试过rootScope,但要知道。

控制器

$scope.checkForCall = function(){
    $http({
        url: $locationProvider + 'broadcast_call',
        method: "GET"
    }).success(function (data){
        if(data != 'none'){
            $scope.ccards = data.broadcast;
            $scope.hasData = 1;
        }   else    {
            $scope.hasData = 0;
        }
    });
}

我的指示

 app.directive('cards', function($timeout,$interval){
    return{
        restrict: 'EAC',
        template: '<h1>NOT FOUND</h1>',
        link: function($scope){
               if($scope.hasData == 1){ // UNDEFINE 
                 console.log("Has data")
               }else{
                 console.log("not found")
               }
        }
    };
});

2 个答案:

答案 0 :(得分:1)

因为您使用来自$ http .success的数据,所以它是异步更改。这意味着scope.hasData首先是未定义的,然后在以后更改为0或1。

对于您的情况,您可以在指令中设置一个观察者,以便它在检测到更改时可以执行某些操作。

link: function (scope, element, attrs){ // fix this line as suggested by other poster
     scope.$watch(function(){
         return scope.hasData;
     },
     function() {
         if(scope.hasData == 1){
             console.log("Has data");
         }
         else if(scope.hasData == 0){
             console.log("not found");
         }
         else {
             console.log("not ready yet");
         }
     });
}

答案 1 :(得分:0)

你可以这样做。

示例html:

<h1 cards dataTwoWayBinding="hasData">

JS -

指令

app.directive('cards', function($timeout,$interval){
return{
    restrict: 'EAC',
    scope : {
                dataTwoWayBinding:'=dataTwoWayBinding',

            }
    template: '<h1>NOT FOUND</h1>',
    link: function($scope){

            if(dataTwoWayBinding.data==1){
                //code
            }else{
                //code
            } 

    }
};
});

CONTROLLER -

$scope.checkForCall = function(){
    $http({
        url: $locationProvider + 'broadcast_call',
        method: "GET"
    }).success(function (data){
        $scope.hasData = {}; 
        if(data != 'none'){
            $scope.ccards = data.broadcast;
            $scope.hasData.data = 1;
        }   else    {

            $scope.hasData.data = 0;
        }
    });
}

我没有测试过代码。如果有任何问题,请告诉我。