2015-10-07 2 views
3

Я использую AngularJS с TypeScript, и теперь мне нужно передать параметр из представления в контроллер. Это так, как я пытаюсь это сделать (с помощью нг-INIT):Angular + TypeScript - передать параметр из представления в контроллер

<div class="col-md-9" ng-controller="MapIZSController" ng-init="init('IZS')"> 

"IZS" значение должно быть передано в контроллер. Контроллер выглядит следующим образом:

export class MapIZSController 
{ 
    static $inject = ["$scope", "leafletData"]; 
    private m_scope: IMapIZSScope; 
    private m_leafletData; 

    constructor($scope: IMapIZSScope, leafletData) 
    { 
     // the first way I tried 
     $scope.init = function (type) { 
      console.log("type is: " + type); 
     }; 
     // the second way I tried 
     $scope.init = this.init; 
    } 

    public init = (init: any) => { 
     console.log("init is: " + init) 
    } 

Моя проблема заключается в том, что я хотел бы получить тип, но

  • первый путь никогда не вызывается и
  • второй тоже.

Можете ли вы дать мне несколько советов, пожалуйста?

+0

это * может * работать, но это не [предполагаемое использование для 'ng-init'] (https://docs.angularjs.org/api/ng/directive/ngInit). «В эту директиву можно злоупотреблять, чтобы добавить ненужные суммы логики в ваши шаблоны. Существует только несколько подходящих применений' ngInit', например, для сглаживания специальных свойств 'ngRepeat' ...». 'ng-init' - это директива с приоритетом, которая означает, что она не может выполняться в ожидаемом порядке, и вы можете полагаться на данные, которые еще не были доступны. – Claies

ответ

3

Я бы сказал, что вы на правильном пути. Существует a working plunker

Это может быть немного упрощенный контроллер:

namespace MyNamespace 
{ 
    export class MapIZSController 
    { 
    static $inject = ["$scope", "leafletData"]; 
    private m_scope: IMapIZSScope; 
    private m_leafletData; 

    private _type; 
    constructor($scope: IMapIZSScope, leafletData) 
    { 
     // // the first way I tried 
     // $scope.init = function (type) { 
     //  console.log("type is: " + type); 
     // }; 
     // // the second way I tried 
     // $scope.init = this.init; 
    } 

    public init = (type: any) => { 
     this._type = type 
     console.log("type is: " + this._type) 
    } 
    } 
} 

и таким образом, мы можем назвать инициализации него:

<div class="col-md-9" 
    ng-controller="MapIZSController as ctrl" 
    ng-init="ctrl.init('IZS')"> 
</div> 

Таким образом, мы используем controllerAs подход и имеют доступ к контроллер через ctrl. ... и таким образом позвонить по телефону ctrl.init()

Проверьте его here

+0

Спасибо. Но как насчет того, нужно ли мне знать, какой тип он уже находится в конструкторе? Это возможно? –

+1

В общем, если вам нужно передать некоторые значения вашему контроллеру (во время создания) - используйте собственный угловой подход - директиву. Здесь вы можете определить свойства вашей $ scope (или напрямую связать ее с ctrl.) И получить к ним доступ даже в конструкторе (или хотя бы на некоторых часах $ до тех пор, пока они не будут разрешены). проверьте это Q & A с помощью рабочего примера - http://stackoverflow.com/q/32993497/1679310 –

+1

А также здесь http://stackoverflow.com/q/30482138/1679310;) надеюсь, что эти подсказки помогут ... –

Смежные вопросы