【问题标题】:Scope $watch between controller and directive not working only after minification控制器和指令之间的范围 $watch 仅在缩小后才起作用
【发布时间】:2015-11-15 14:03:02
【问题描述】:

我有一个带有指令的控制器/视图。该指令更改控制器范围正在监视的变量。在我缩小所有内容之前,这非常有效。一旦缩小,没有错误,但手表处理程序不再触发。

我的应用程序是由grunt 使用yeoman 角度生成器编译的。经过大量工作,它正在正确构建所有内容(通过grunt serve:dist)。除了 watch 函数处理程序不工作之外,应用程序的其余部分都很好。在开发过程中,一切正常。

我很确定我的所有依赖项都已声明以避免任何缩小问题。我还使用ngAnnotate 来清理我错过的任何内容。可能是什么问题呢?

这是一个简化的例子:

控制器:

(function(){
    'use strict';

    angular
        .module('app')
        .controller('MyCtrl', MyCtrl);

    MyCtrl.$inject = ['$scope', ...];

    function MyCtrl($scope, ...) {
        $scope.color = null;

        $scope.$watch('color', function(newVal, oldVal) {
            console.log('Color changed');
        });
    };
})();

查看:

<mydirective color="color"></mydirective>

指令:

(function(){
    'use strict';

    angular
        .module('app')
        .directive('mydirective', mydirective);

    function mydirective() {
        return {
            restrict: 'E',
            scope: {
                color: '=color'
            },
            templateUrl: 'directive.html',
            link: function($scope, element, attrs, form) {
                $scope.clickHandler = function(val) {
                    $scope.color = val;
                };
            }
        };
    }
})();

指令模板:

<button ng-click="clickHandler('blue')"></button>

【问题讨论】:

  • 这是在黑暗中的镜头,但您可以尝试将 $scope 更改为指令中的范围。我在某处读到,在指令中您应该使用范围而不是 $scope,因为它不是依赖注入。
  • 实际上是个好建议,但不幸的是它没有任何区别。关闭uglify 后问题仍然存在,所以看起来它实际上是一个普遍的构建问题。我感觉这可能与模板缓存有关。我得做更多的调查

标签: angularjs gruntjs


【解决方案1】:

经过多次试验和错误,这最终成为我的第三方凉亭组件缩小的问题(特别是我认为它是 jquery-uiui-date)。与我最初的想法无关,但有人最终可能会出现相同的症状。我最终不得不手动返回我的 grunt 文件的每个步骤,直到它工作(这是我在 vendor.js 中删除额外未使用的依赖项时)

【讨论】:

  • 我也有同样的问题,但是有没有容易找到多余的未使用的依赖项?
猜你喜欢
  • 2016-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2014-05-05
  • 2013-03-01
  • 2015-07-20
相关资源
最近更新 更多