AngularJS 组件:在控制器中使用绑定对象

AngularJS component: using binding object in controller

我使用 Angular 组件(第一个示例来自 this)。当我在组件中绑定对象时,它可以在模板中访问,但不能在控制器中访问。

js:

function HeroDetailController() {
  console.log("Here I want to use hero.name: ");
  console.log(hero.name); // I want to use binding object in controller, but doesn't work
}

angular.module('heroApp').component('heroDetail', {
  templateUrl: 'heroDetail.html',
  controller: HeroDetailController,
  controllerAs: 'ctrl',
  bindings: {
    hero: '='
  }
});

html:

<hero-detail hero="ctrl.hero"></hero-detail>

模板html(这里有效):

<span>Name: {{ctrl.hero.name}}</span>

错误:

ReferenceError: hero is not defined

笨蛋:https://plnkr.co/edit/U9CJLs6jgrlsZH6tUdr0

您将在 HeroDetailController 上下文中获得 bindings 值,即 this

function HeroDetailController() {
  var ctrl = this;
  console.log("Here I want to use hero.name: ");
  console.log(ctrl.hero);
}

虽然以上行不通。因为它不会在第一个摘要周期将初始绑定传递给组件。

要获取价值,您可以在组件上使用 $onInit 生命周期价值。

function HeroDetailController() {
  var ctrl = this;
  console.log("Here I want to use hero.name: ");
  ctrl.$onInit = function(){
    console.log(ctrl.hero);
  }
}

即使没有$onInit也可以直接获取值。同样,您必须像下面这样更改 $compileProvider 配置。(它已在 1.6+ 中引入)

.config(function($compileProvider){
  $compileProvider.preAssignBindingsEnabled(true)
});

注意:理想情况下,您不应该在您的应用程序中强制执行上述设置,我只是为了演示。

Demo Plunkr