【问题标题】:Angular Directive attrs.$observe角度指令 attrs.$observe
【发布时间】:2014-03-22 16:39:17
【问题描述】:

我在网上找到了这个 Angular 指令来添加一个 twitter 分享按钮。这一切看起来都很顺利,但我无法弄清楚attrs.$observe 到底在做什么。

我查看了文档,但在任何地方都看不到 $observe 的引用。

该指令似乎只是添加了来自控制器的href,所以任何人都可以解释其余代码在做什么吗?

module.directive('shareTwitter', ['$window', function($window) {

    return {
        restrict: 'A',
        link: function($scope, element, attrs) {

            $scope.share = function() {

                var href = 'https://twitter.com/share';

                $scope.url = attrs.shareUrl || $window.location.href;
                $scope.text = attrs.shareText || false;

                href += '?url=' + encodeURIComponent($scope.url);
                if($scope.text) {
                    href += '&text=' + encodeURIComponent($scope.text);
                }

                element.attr('href', href);
            }

            $scope.share();

            attrs.$observe('shareUrl', function() {
                $scope.share();
            });

            attrs.$observe('shareText', function() {
                $scope.share();
            });
        }
    }
}]);


<a href="" target="_blank" share-twitter share-url="[[shareTwitterUrl]]" share-text="[[shareTwitterText]]">Twitter</a>

【问题讨论】:

标签: angularjs directive


【解决方案1】:

简而言之:

每当 'shareTwitterUrl' 或 'shareTwitterText' 改变时,都会调用 share 函数。

来自另一个 stackoverflow 答案: (https://stackoverflow.com/a/14907826/2874153)

$observe() 是 Attributes 对象上的一个方法,因此,它可以 仅用于观察/观察 DOM 属性的值变化。它 仅在指令内部使用/调用。需要时使用 $observe 观察/观察包含插值的 DOM 属性(即, {{}})。例如,attr1="Name: {{name}}",然后在指令中: attrs.$observe('attr1', ...)。 (如果你尝试 scope.$watch(attrs.attr1, ...)由于 {{}},它不会起作用——你会得到未定义的。)使用 $watch 其他一切。

来自 Angular 文档: (http://docs.angularjs.org/api/ng/type/$compile.directive.Attributes)

$compile.directive.Attributes#$observe(key, fn);

观察一个插值属性。

观察者函数将在下一次 $digest fol 期间被调用一次 低编译。每当插值发生变化时,就会调用观察者。

【讨论】:

  • 这个值会改变吗,我想它只是在应用程序开始时设置一次
  • 这真的取决于人们如何选择使用它;)但是这样做还有另一个很好的理由。假设您从服务器获取 shareTwitterUrl,这可能会花费一些时间,那么您可能会冒 shareTwitterUrl 在指令启动之前尚未获得其值的风险。所以当最终 shareTwitterUrl 获得它的值时,指令将被更新为正确的值。
【解决方案2】:
<input type="text" ng-model="value" >
<p sr = "_{{value}}_">sr </p>


.directive('sr',function(){

return {

        link: function(element, $scope, attrs){
                attrs.$observe('sr', function() {
                                console.log('change observe')
                    });
            }
    };
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2016-05-05
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多