【问题标题】:What is the execution order in angularJS?angularJS中的执行顺序是什么?
【发布时间】:2015-04-14 10:42:01
【问题描述】:

我是一个开始使用角度材料的新手。我正在使用边栏。

基本上是这样的

<md-sidenav layout="column" class="md-sidenav-left md-whiteframe-z2" md-component-id="left">
</md-sidenav>
<md-button id="side-button" ng-click="toggleLeft()"></md-button>
$scope.toggleLeft = function() {
                $mdSidenav('left').toggle()
                    .then(function(){
                        $log.debug("toggle left is done");
                    });
            };

它按预期工作。但是有一件奇特的事情,当我在那个 js 之后写了另一行:

timeLine.toggle_left_most = $scope.toggleLeft();

并将ng-click="toggleLeft()" 替换为ng-click="timeLine.toggle_left_most()",它返回给我“找不到句柄'left'的实例”。

但是当我在$mdSidenav('left').toggle() 后面插入一行以查询 md-component-id="left" 的元素时,它返回了该对象。这导致我询问AngularJS的执行顺序和更深层次的原则。

我的问题是,为什么它在 DOM 已经加载时返回“未找到实例”?为什么添加一行赋值会破坏代码? $mdSidenav 是否不仅需要 DOM,还需要加载其他一些东西?关键是什么?

问题是因为当我不写那行时,对 $scope.toggleLeft 的赋值不会立即执行吗?那么什么时候执行呢?

【问题讨论】:

  • directives 有priority: 0, 属性,你可以设置它

标签: javascript angularjs angularjs-service angular-material


【解决方案1】:

你声明

timeLine.toggle_left_most = $scope.toggleLeft();

timeLine 对象将不适用于您的 html 模板,因为它不是 $scope 变量,因此您的代码应如下所示

var toggleLeft=function() {
                $mdSidenav('left').toggle()
                    .then(function(){
                        $log.debug("toggle left is done");
                    });
            };

$scope.timeLine.toggle_left_most=toggleLeft;

通常我遵循上述风格。 我不确定这个答案...

【讨论】:

    【解决方案2】:

    在 JavaScript 中,函数是对象。如果您使用(),您正在执行该函数,但重要的是要了解您不是在管理函数的定义。

    所以,timeLine.toggle_left_most = $scope.toggleLeft(); 实际上正在运行$scope.toggleLeft 并将其返回值分配给timeLine.toggle_left_most

    我不明白你为什么要这样。

    【讨论】:

      【解决方案3】:

      No instance found for handle left 的问题在此处描述 - https://github.com/SebastianMetzger/angular-material-inbox/issues/1

      除了那里描述的解决方案之外,这对我来说很有效 - 使用 $mdComponentRegistry 的getInstances 方法检查当前可用的项目并跳过没有:

      //on some event, state change for example
      $rootScope.$on('$stateChangeStart', function(event, toState, toStateParams) {
        if ($mdComponentRegistry.getInstances().length) $mdSidenav('left').close();
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2020-02-14
        • 2011-10-10
        • 2013-09-26
        相关资源
        最近更新 更多