2017-04-19 47 views
1

我想不通爲什麼this plnkr不起作用。函數(表達式)綁定不起作用

我試圖將一個簡單的函數從父控制器綁定到子自定義指令。如果我使用&,它不起作用,但如果我使用=<,它工作正常。我明白這是不好的做法,但爲什麼它能正常工作並且&不?也許我錯過了很簡單的事情?

這裏的腳本:

JS

var app = angular.module('myApp',['ngMaterial']); 

app.controller('mainCtrl',mainCtrl); 
function mainCtrl(){ 
    var main = this; 

    main.test = function(){console.log("test")}; 
} 

app.directive('myDirective',myDirective); 
function myDirective(){ 
    return { 
    scope: {}, 
    controller: myCtrl, 
    controllerAs: "dir", 
    bindToController: { 
     //fn: '&' //This doesn't work 
     fn: '<' // This works 
    }, 
    template: '<md-button ng-click="dir.fn()" class="md-raised">click</md-button>' 
    }; 

    function myCtrl(){ 

    } 
} 

HTML

<div ng-app="myApp" ng-controller="mainCtrl as main"> 
    <my-directive fn="main.test"></my-directive> 
    </div> 
+0

我希望這有助於http://stackoverflow.com/questions/21712147/angularjs-differences-among-in-directive-scope –

回答

1

&結合提供了一個包裝函數來執行的表達式。所以dir.fn()所做的就是獲得test屬性。

The documentation說,

&或& ATTR - 提供了一種在父範圍的上下文中執行的表達式。如果未指定attr名稱,則假定屬性名稱與本地名稱相同。

爲了使其按預期工作應該是

<my-directive fn="main.test()"></my-directive> 
+0

的關鍵在於HTML中的屬性綁定需要括號。我不清楚這是爲什麼;我敢肯定,我錯過了Angular的微妙之處。在純JS中,我認爲'myFunction()'是執行函數,'myFunction'是函數引用。你可以解釋嗎? –

+1

這是想想它的正確方法。重要的是上下文。 'main.test()'表達式被傳遞到&binding並且在每次調用dir.fn()時被評估。如果在Angular表達式中允許使用函數,那麼可以用'fn =「function(){return main.test()}」'來進行'<'綁定。 – estus

+0

我錯誤地引用了文檔並更新了&綁定的報價。 – estus