2014-03-24 53 views
1

我遇到的東西,我想在AngularJS做的一個問題。 事情是這樣的:Angularjs未定義的對象時,屬性雙向綁定

我有一個控制器和我有這樣定義的指令:

helpers.directive('someEvent', function() { 

    ... 
    scope: { 
     api: '=' 
    } 
    ... 
    controller: ['$scope', function($scope) { 

     $scope.hasSomeEventOccured = function(){ 

      return booleanVariable 
     }; 

     $scope.api = { 
      hasSomeEventOccured: $scope.hasSomeEventOccured 
     } 
    }] 

}); 

然後,在一些其他控制器我想訪問該功能hasSomeEventOccured ... 控制器定義如下:與

moduleName.controller('moduleSomethingController', 
['$scope', '$state', 'moduleRepository', function ($scope, $state, moduleRepository) { 

    $scope.theEventOccured = $scope.someEventApi.hasSomeEventOccured(); 

}]); 

在CSHTML文件我有:

<some-event api="someEventApi" ></some-event> 

<div ng-if="theEventOccured"></div> 

,偶爾發生的錯誤是$scope.someEventApi是未定義的。 所以這個換行符:$scope.theEventOccured = $scope.someEventApi.hasSomeEventOccured(); 我想這是因爲在完成與someEvent結合之前發生moduleSomethingController內調用hasSomeEventOccured

我的問題是你如何解決這個問題?

我知道,在一個指令,你會碰到這樣的:

link: function(scope, element, attrs) { 
    attrs.$observe(...); 
} 

但我怎麼能實現像等待綁定在我的情況來完成?

回答

0

SO-你「$ scope.someEventApi未定義」的錯誤,究其原因是因爲你沒有設置任何地方。它是不確定的!您在控制器內部使用的一切應該是界定(VAR X =什麼......)或注射(就像你注入你的例子$範圍)

我看到它的方式,你有兩個選擇,讓你想:

  1. 一個共同的和直接的方式將是定義裏面控制器你的函數,然後發送功能的指令。這意味着你將需要添加您的指令定義這樣的事情:

scope: {theEventOccured: '&' }

的&標誌意味着它是一個功能。

控制器內:

$scope.theEventOccured = function() { /* your code here */ } 

這way-的API是你的控制器內實際定義,指令使用它需要的時候。

  1. 用於更復雜的stuff-您可以創建一個.factory並將其綁定到你的控制器和指令。

  2. 如果您嘗試在不同的控制器(或控制器的指令)之間進行通信,您可以使用工廠或$ broadcast事件。見$廣播和$發出其他​​

兩個重要的事情: 通常你不應該使用一個指令的功能,在它的父控制器範圍 如果我理解你想要達到的目標,你不需要$觀察這裏。