javascript - Angular .js : directive object in scope is always undefined

标签 javascript angularjs angularjs-directive angularjs-scope

编辑: fork 了@EliteOctagon 的 plunker,奇怪的是它在工作!无法理解为什么下面的代码不是。 http://plnkr.co/edit/y8uvulA9RHQ1Y9mwzin1

EDIT2: fork 了之前的 plunker 并向 Controller 的逻辑添加了 $timeout,它停止工作了!猜猜这真的是加载顺序。查看:http://plnkr.co/edit/ivmGQmEHTatNzBWhppyf

我是 Angular 的新手,无法理解指令隔离范围。

我需要创建一个指令来打印出 <span/>在我的页面中,包含关于 View Controller 中的对象的信息。

我试图做的是隔离指令范围并通过具有双向绑定(bind)的属性传递对象(参见下面的代码)。但是,当试图访问 link 中的对象时指令的功能它总是以未定义的形式出现。

我在这里错过了什么?

提前谢谢你们。

指令在 html View 模板中的使用:

<party-starts party="party"></party-starts>

指令JS代码

.directive('partyStarts', function(){
    return {
        restrict: 'E',
        template: '<div id="partyStart><i class="icon ion-pin"></i> </div>',
        scope: {
            party: '='
        },
        link: function(scope, el) {
            var party = scope.party;
            var icon = el.find('i');
            var statusStr = angular.element('<span/>');
            var final;

            console.log('scope '+scope);

            if(party.Diatodo){
                if(party.datahora.isSame(moment(), 'day') || party.datahora.isSame(moment().add(1, 'd'), 'day')){
                    icon.css({
                        'color': 'green'            
                    });
                    statusStr.text(' É hoje');
                    el.append(statusStr);
                }else{
                    icon.css({
                        'color': '#999'            
                    });
                    statusStr.text(' Começa em '+party.datahora.fromNow());
                    el.append(statusStr);
                }
                return;
            }

            if(party.datahora.unix() == party.datahoraf.unix()){
                final = party.datahora.clone().add(1, 'd').hour(6);
            }else{
                final = party.datahoraf;
            }

            if(party.datahora.twix(final).isCurrent()){
                icon.css({
                    'color': 'green'            
                });
                statusStr.text(' Começou há '+party.datahora.fromNow());
                el.append(statusStr);
            }else if(party.datahora.twix(final).isFuture()){
                icon.css({
                    'color': '#999'            
                });
                statusStr.text(' Começa em '+party.datahora.fromNow());
                el.append(statusStr);
            }else{
                icon.css({
                    'color': 'red'            
                });
                statusStr.text(' Já terminou');
                el.append(statusStr);
            }
        }
    };
})

最佳答案

将指令的 party 范围变量包装在观察器中并等待它被初始化。在您的情况下,您不这样做,因此您的所有逻辑都在分配 scope.party 之前运行。

link: function(scope, el) {

  var watcher = scope.$watch('party', function() {
    if(scope.party === undefined) return;

    // at this point it is defined, do work

    // delete watcher if appropriate
    watcher();
  })
}

关于javascript - Angular .js : directive object in scope is always undefined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26893952/

相关文章:

用于选择的 Angularjs 自定义指令

javascript - 如何让按钮在点击时显示

javascript - 使用 servlet 响应中的 javascript 显示图像

javascript - 同时移动所有节点(包括链接)?

javascript - 多个ajax请求

angularjs - ng-show 在指令模板中不起作用

javascript - 如何使用 PHP 以动态形式上传文件并将路径/文件名与其他数据一起保存到 mysql

javascript - transclude() 和 ng-repeat 玩得不好

javascript - Flot js 和 Angular 问题

javascript - 如何将 ngStyle 传递给在 Angular 中定义为元素的指令?