2013-08-19 101 views
0

如果您有一條指令在頁面上多次使用,那麼1條指令如何與另一條指令進行通信?有關指令調用的角度指令

我試圖將指令鏈在一起的父子關係。當單擊指令A時,我想過濾指令B,只讓指令A中所選項目的子項。在這種情況下,頁面上可能有無數個指令和關係。

通常情況下,我會指令一個調用一個過濾器方法,它的每個孩子,每個孩子稱它是孩子繼續過濾下來的層次結構。

但我不知道如果調用方法從一個指令到另一個是possibe。

謝謝

回答

1

這聽起來像你正在尋找一個指令控制器。您可以使用指令的require:參數來拉入另一個指令的控制器。它看起來像這樣:

app.directive('foo', function() { 
    return { 
    restrict: 'A', 
    controller: function() { 
     this.qux = function() { 
      console.log("I'm from foo!"); 
     }; 
    }, 
    link: function(scope, element, attrs) { 

    } 
    }; 
}); 

app.directive('bar', function() { 
    return { 
     restrict: 'A', 
     require: '^foo', 
     link: function(scope, element, attrs, foo) { 
      foo.qux(); 
     } 
    }; 
}); 

從角度docs,這裏是符號,你可以使用require和他們做什麼。

(no prefix) - Locate the required controller on the current element. 
? - Attempt to locate the required controller, or return null if not found. 
^ - Locate the required controller by searching the element's parents. 
?^ - Attempt to locate the required controller by searching the element's parents, or return null if not found. 

這是我的例子的jsbin。 http://jsbin.com/aLikEF/1/edit

另一個可能適用於您需要的選項是提供一項服務,每個指令設置一個監視並且可以操作。例如,指令1可以觀察服務中的一個屬性並響應更改,並設置一個可以更改該屬性的按鈕。然後,指令2也可以觀看和更改服務,並且他們會對彼此做出響應,但是您設置了該服務。如果你還需要一個jsbin,請讓我知道。

我希望這有助於!

+0

非常感謝。在這種情況下,我們對每個表格重複使用相同的指令,這樣require就無法工作(我不認爲?)。我們需要通過變量來告訴表,哪些表是兒童,控制器需要通過某種類型的id(如html元素ID)動態地查找兒童控制器。那可能嗎? – jadent

+0

嗯。你可以很容易地找到範圍。這應該做'var myScope = angular.element('#myElement')。scope()'。我真的不太清楚你在這裏做什麼。這聽起來很混亂。另一個與我聽起來相關的想法是,你可以使用指令的工廠 - 這裏的區域:'.directive('myDirective',function(){//這個區域!! return {'用於像對象或數組那樣的東西運行指令可以看到,如果在每次運行中都有一些共享信息,可以將它添加到數組或對象中以供其他人使用。 – m59

+0

@jadent如果有任何一種方法有幫助,我會欣然接受upvote/answer: )我看到有人已經撕掉了我一半的回答,並用它來回答。此外,請參閱傳統使用的服務來一起更新$ scope屬性。http://stackoverflow.com/questions/18668239/controllers-not-talking-to-each-other-via-service-in-angular-js/18668305#18668305 – m59

0

您可以嘗試將所有數據放入指令可以引用的服務中。

是這樣的:

app.factory('selectedStuffService', function(){ 
    var allItems = []; 
    var selectedItems = []; 

    function addSelectedItem(item){ 
     selectedItems.push(item); 
    } 

    return { 
     allItems: allItems, 
     selectedItems: selectedItems, 
     addSelectedItem: addSelectedItem 
    } 
} 

相互作用在指令的變化在selectedItems陣列和指令B中的值可以綁定到它。您可以輕鬆地將其他方法添加到服務中,以根據需要過濾/處理項目,並且任何使用該服務的指令都應該能夠根據其他指令所做的更改進行更新。