2016-01-22 75 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

相關問題