2016-03-10 100 views
1

我有一些角1.4代碼,我繼承,裏面有我想整理一些奇怪的範圍有關的問題 - 和我被困在一個特定的一個。呼叫角控制器功能從指令

我有一個ES6類控制器(Babelified) - 在裏面,我有這樣的

save(data) { 
    this.validate(data); 
    .... do some more stuff 
} 

的方法我也有一個視圖和模型和HTML和所有的好東西。在這裏面我有一個單選按鈕自定義指令 - 這樣

<radio onupdate="vm.save" data="model.myradio1" /> 

我的電臺指令,似乎有兩種綁定的onupdate &數據

.directive('radio',() => { 
    return { 
     restrict: 'E', 
     replace: true, 
     templateUrl: 'radio', 
     scope: { 
      data: '=', 
      onupdate: '=' 
     } 
    }; 
}) 

模板包含

ng-click="radio.onupdate($parent.data);" <-- This looks suspect but no idea what it does! 

然而 - 這則在爆炸的方式我也沒有想到:

this.validate is not a function 

我可以看到這是怎麼發生 - this現指單選按鈕範圍。但是,我該如何解決它?我對Angular很新穎。

+0

http://stackoverflow.com/questions/35854586/how-to-access-angularjs-variable-in-other-html-page-java-script/35857536#35857536。看到這篇文章的答案。訪問功能而不是變量。 –

+0

發佈指令代碼:其範圍配置以及如何從內部調用onupdate。 – dfsq

+0

我不知道這是如何幫助我將'this'重新綁定到我的控制器而不是指令範圍? – Silver

回答

1

爲了從你需要創建&範圍配置的「引用」功能的指令調用控制器的方法:從指令模板

.directive('radio',() => { 
    return { 
     restrict: 'E', 
     replace: true, 
     templateUrl: 'radio', 
     scope: { 
      data: '=', 
      onupdate: '&' 
     } 
    }; 
}) 

然後你需要調用它像這樣:

ng-click="onupdate({data: $parent.data});" 

最後的無線電指令的使用變爲:

<radio onupdate="vm.save(data)" data="model.myradio1" /> 
0

你好,我堅持自己的問題的標題如何從指令呼叫控制器功能」。

我做了一個例子,使用<select>元素,並調用控制器函數$scope.filterHall()發送選定的對象,無論用戶何時更改值。

指令(我得到的changeHall功能,我叫它爲模板,見下文):

.directive('eventHallsList', function($timeout, $log, $http, $compile) { 
    return { 
     restrict: 'AE', 
     replace: true, 
     scope: { 
     changeHall: '&', 
     items: '=', 
     model: '=' 
     }, 
     templateUrl: 'mytemplate.tpl.html', 
     link: function(scope, element, attrs) { 
     } 

    } 
    }); 

模板:進入選擇元素每次用戶選擇的值,我打電話其被綁定到控制器的功能$scope.filterHall(),並把它傳遞對象的changeHall()

<select style="color:#337ab7" 
     ng-change="changeHall({value:model})" ng-model="model" 
     ng-options="item as item.name for item in items"> 
    <option value=""> choose hall</option> 
</select> 

活生生的例子:http://plnkr.co/edit/iCS0blQjceA4tIIb8bUV?p=preview

希望有所幫助,祝你好運。

0

這是很常見的問題,當你在使用HTML元素屬性***登記聽衆。您必須將控制器上下文綁定到偵聽器函數。

<radio onupdate="vm.save.bind(vm)" data="model.myradio1" /> 

我希望它能爲你工作。

+1

你不能在Angular表達式中使用'bind'。 https://docs.angularjs.org/error/$parse/isecff – dfsq