AngularJS等待范围变量从自定义指令进行评估

时间:2013-07-26 12:51:47

标签: angularjs angularjs-directive angularjs-scope angularjs-service

我正在AngularJS中盯着我。

我创建了一个自定义指令:

app.directive('myScroll',function(){
return {
    restrict: 'A',
    transclude: true,

    template: '<div ng-transclude></div>',
    link: function(scope , element , attrs) {

    element.addClass('scroll-pane');

    scope.$watch('tasks', function(newval, oldval){
          if ( newval  ) 
          {

            console.log(newval);
            console.log(newval.length);
        }

    });

        console.log("afer watch exper");
        console.log (tasks);



    }


  };

});

使用以下HTML:

<div my-scroll>
        <ul>
            <li data-ng-repeat="task in tasks" class="task-wrapper">
                <div class="task-element">
                    <div class="name">{{task.name}}</div>
                    <div class="text">{{task.action}}</div>
                </div>
            </li>
        </ul>
    </div>

通过控制器调用的服务评估tasks对象(如果需要,我将发布其代码)。

在指令代码中,task对象是未定义的,因为我必须得到任务长度来执行更多的css命令我必须等待ng-repeat完成或者只是等待任务变量将被评估。

由于某种原因,$ watch语句的内部和内部始终未定义任务。 我可以在控制台中看到首先打印“看完经验后”,然后是“在手表中”,但仍然没有值。 newval对象有[move2:function]但它的length属性保持返回0,但它保留了一系列资源和我的任务。

我在这里缺少什么以及如何在评估任务变量时执行命令?

感谢帮助者。

2 个答案:

答案 0 :(得分:11)

您应该使用scope.tasks来引用数据。

app = angular.module('myApp', []);
app.directive('myScroll', function () {
    return {
        restrict: 'A',
        transclude: true,

        template: '<div ng-transclude></div>',
        link: function (scope, element, attrs) {

            element.addClass('scroll-pane');

            scope.$watch('tasks', function (newval, oldval) {
                if (newval) {
                    console.log(newval);
                    console.log(newval.length);
                }
            });
            console.log("afer watch exper");
            console.log(scope.tasks); //this will log the actual data.
        }
    };
});

function Ctrl($scope) {
    $scope.tasks = [{
        name: "task1",
        action: "action1"
    }]
}

答案 1 :(得分:5)

尝试将第3个参数 - true 传递给$ watch:

scope.$watch('tasks', function(newval, oldval){
    if(newval){
        console.log(newval);
        console.log(newval.length);
    }
},true);