2016-01-22 100 views
0

我已经定义我的角应用内以下指令:Angular指令“=”值绑定到范围,但未定义?

(function() { 
    'use strict'; 

    angular 
    .module('almonds') 
    .directive('security', ['$animate', 'AuthFactory', directive]); 

    function directive($animate, AuthFactory) { 
     var directive = { 
      restrict: 'EA', 
      scope: { 
       operation: "@", 
       clearance: "@", 
       project: "=" 
      }, 
      link: linkFunc 
     }; 

     return directive; 

     function linkFunc($scope, $element, $attr, ctrl, $transclude) { 
      var block, childScope, previousElements; 

      console.log($scope.project); 

      if($scope.project) { 
       var projectId = $scope.project.id; 
      } 

      var operation = $scope.operation; 
      var clearance = $scope.clearance; 


      if (projectId) { 
       var value = AuthFactory.hasProjectAccess(projectId, clearance); 
       console.log('PROJECT SECURITY:', projectId, clearance, value); 
      } else { 
       var value = AuthFactory.hasAccess(operation, clearance); 
       console.log('ORG SECURITY:', operation, clearance, value); 
      } 
     } 
    } 
// Controller.$inject = ['$scope']; 
// 
// function Controller($scope) { 
//  var vm = this; 
// 
//  activate(); 
// 
//  function activate() { 
// 
//  } 
// } 
})(); 

应当用作接收一个operationproject值以及一个clearance值,这将随后被用于是否所述的元件元素将呈现(我省略了那部分,但它的功能与ng-if基本相同)。

下面是使用它的一个例子:

<span security project="vm.project" clearance="admin"> 
    <a role="button" ng-click="vm.confirmDeletion();"><span class="melon-icon-md melon-icon-trash"></span></a> 
</span> 

发生了什么事虽然是,即使vm.project确实定义,即console.log($scope.project);产生undefined。有趣的是,如果我只是console.log($scope);包含一个project财产与我需要的信息。我究竟做错了什么?

我其实只需要在项目的id价值,所以我可以在指令中通过在整个project对象并访问其id,或以某种方式单独通过id数。

+0

'<角色= “按钮”'...什么是错的' Quentin

+0

我使用'ui-sref',而不是在特定的链接上,但为了保持一致性,它们都是一样的。 – Tiago

+0

请给我们提供plunker或jsfiddle来查看原因 –

回答

2

当您的指令的链接函数开始执行时,vm.project在该点处未定义。在$ scope.project上设置一个监视。

内部指令:

$scope.$watch('project', function (newValue, oldValue) { 
    if (newValue) { 
     // do stuff 
    } 
}); 
+0

啊,'vm.project'实际上是父控制器内异步调用的结果,所以必须是这种情况。 – Tiago

+1

这是古典的种族问题,每个人在Angular做某事时至少要面对一次,$ watch很好,但是因为价值并没有改变,所以它与watch destroyer一起使用var watchDestroy - $ scope。$ watch('project,function(){如果(某事){//做东西并运行watchDestroy()}})' – maurycy

+1

是的。一旦vm.project被设置,watch就没用了。 – varun