【问题标题】:Angular: Evaluate Expression Passed into Component AttributeAngular:评估传递给组件属性的表达式
【发布时间】:2016-10-22 23:47:17
【问题描述】:

如何将 Angular 表达式的值传递给组件的属性?我正在从 API 中取回价值。

app.controller.js

$http.get(apiUrl).then(function(resp) {
  $scope.name = resp.data.name;
})
...

person.component.js

export const Person = {
  templateUrl: 'person.html',
  bindings: {
      firstName: '@'
  },
  controller: function() {
      console.log(this.firstName);
  }
}

app.html

...
<person first-name="name">

由于某种原因,它没有评估name,而是在控制台中记录undefined

有没有办法解决这个问题,让它在控制器中记录Tom

感谢任何帮助。提前致谢!

我已经设置了一个 jsFiddle here

【问题讨论】:

    标签: angularjs components


    【解决方案1】:

    &amp; 用于表达式,@ 用于插值字符串,所以尝试使用

    firstName: '&'
    

    然后this.firstName() 应该计算传入的表达式。

    另外,firstName 不能保证在$onInit 之前已经被初始化,所以如果你这样做了

    bindings: {
        firstName: '&'
    },
    controller: function() {
        this.$onInit = function() {
            console.log(this.firstName());
        }
    }
    

    您应该会得到预期的结果。

    供参考:https://docs.angularjs.org/guide/component

    $onInit() - 在元素上的所有控制器都已构造并已初始化其绑定后在每个控制器上调用



    编辑:

    在您提供额外信息之后,您可能应该在这种情况下使用单向绑定 (&lt;),因为看起来您只是在传递单个值(而不是表达式),然后您可以检测到$onChanges 的变化。我分叉了你的 jsfiddle 来展示一个潜在的解决方案:http://jsfiddle.net/35xzeo94/

    【讨论】:

    • 我应该解释说我是从 API 中获取数据的,所以它在加载时并不容易获得。我已经设置了一个 jsFiddle here
    • @realph 如果它只是一个变量而不是表达式,那么您可以使用单向 &lt; 绑定。在这种情况下,$onChanges 将在值更新时被调用。但是如果它真的是一个表达式,那么你将无法看到更新的值,除非它在组件的视图中。这是因为组件不应该以这种方式输入,它们应该是 @&lt;,而输出应该是 &amp; 的用途。此外,在你的 jsfiddle 中,你有 name="customerId" 而不是 name="name"
    • @realph 我在我的回答中分叉了你的 jsfiddle,以展示一种方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2020-08-01
    • 2016-12-19
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多