【问题标题】:AngularJS scope property is undefinedAngularJS范围属性未定义
【发布时间】:2013-06-27 20:35:27
【问题描述】:

为什么$scope.orderBy 未定义? 不应该是“测试”吗?

http://jsfiddle.net/XB4QA/4/

var app = angular.module("Foo", []);

app.directive("two", function () {
return {
    scope: {
        orderBy: '@'
    },
    restrict: 'E',
    transclude: true,
    controller: function ($scope, $element, $attrs) {
        console.log($scope.orderBy); // is undefined, why?   
    },
    template: '<div></div>',
    replace: true
};
});

<div ng-app="Foo">
    <two order-by="test">test</two>
</div>

【问题讨论】:

    标签: javascript html angularjs angularjs-directive angularjs-scope


    【解决方案1】:

    @ 绑定在指令的范围内进行插值,并且此插值稍后在指令链接阶段之后进行。这意味着虽然指令模板可以使用绑定,但它们在各种指令配置方法中不可用。但是,= 绑定可立即用于指令,因此如果您想立即访问,我建议使用这样的绑定。

    如果test 是您要访问的文字值,请在属性值周围添加单引号,例如:

    <two order-by="'test'">
    

    如果test 是一个变量,则保持HTML 不变。在任何一种情况下,将绑定更改为:

    scope: {
        orderBy: '='  // = instead of @
    }
    

    【讨论】:

    • 这行得通,但是使用 '=' 使其成为双向的,我只想在本地范围内使用它。
    • 我在回答你的问题“为什么”。如果您不想修改原始值,可以将值复制到新变量中。这个问题有点令人困惑,因为我们无法判断您是否打算使用 test 作为变量,因为您希望该值是 test。
    • "test" 应该是文字,而不是对现有变量的引用,因此您的答案 ("'test'") 是有道理的。感谢您的帮助:)
    • 很好,没问题。由于它是文字,您也可以完全跳过绑定并通过 $attrs.orderBy 访问该值。
    • 最好的方法是使用 $observer 对属性进行观察
    【解决方案2】:

    如果您想使用字符串插值(您使用 @ 似乎就是这种情况),您应该使用 $observe,正如 Ajay 在 cmets 中提到的当前接受的答案。

    或者,如果您的orderBy 属性始终是文字字符串,您可以创建一个空的隔离范围并且不要尝试绑定orderBy。然后你可以使用$attrs.orderBy 来获取字符串值。

    这很好用。

    app.directive("two", function () {
      return {
        scope: {
          orderBy: '@'
        },
        restrict: 'E',
        transclude: true,
        controller: function ($scope, $element, $attrs) {
          $attrs.$observe('orderBy', function() {
            console.log($scope.orderBy);
          });
        },
        template: '<div></div>',
        replace: true
      };
    });
    

    也是这样:

    app.directive("two", function () {
      return {
        scope: {
        },
        restrict: 'E',
        transclude: true,
        controller: function ($scope, $element, $attrs) {
          console.log($attrs.orderBy);
        },
        template: '<div></div>',
        replace: true
      };
    });
    

    【讨论】:

    • 他的主要问题是为什么该值不能立即可用。如果要立即使用,@ 不是一个好的解决方案,因为即使使用$observe,也不会在稍后解析。此外,没有插值,因此没有理由使用@ 绑定。在 cmets 中也已经提到了 $attrs.orderBy。
    • 我认为当前接受的答案虽然有效,但实际上并没有回答原始问题。当然,您可以切换到双向数据绑定,但这并不能解释为什么 @ 不起作用。如果 OP 想要始终使用文字,则根本没有理由使用任何绑定(如我的回答和您的 cmets 中所述)。
    • 似乎问题在于为什么该值未定义,而不是如何使用 @ 绑定,即使它不合适。我不认为这可以回答或增加上面的讨论,但不用担心。
    • 我想我只是以不同的方式阅读了这个问题。我读它是因为当我认为它应该起作用时它为什么不起作用(并且由于 @ 周围的 AngularJS 文档不是特别好,这是一个合理的问题)。无论哪种方式,这个答案更多的是提供额外的信息而不是其他任何东西。我确实认为它增加了讨论,举例说明如何使用@ 以及如何创建没有绑定的隔离范围以访问文字字符串。除了您关于双向绑定和 cmets 的回答之外,它几乎涵盖了可用的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-05
    相关资源
    最近更新 更多