angularJS的执行顺序是什么?

时间:2015-04-14 10:42:02

标签: javascript angularjs angularjs-service angular-material

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

基本上,就像

<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()",它与我一起返回“找不到处理'左边'的实例。”

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

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

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

3 个答案:

答案 0 :(得分:2)

You declared

timeLine.toggle_left_most = $scope.toggleLeft();

but timeLine object will not be available to your html template since it is not a $scope variable so your code should be as follows

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

$scope.timeLine.toggle_left_most=toggleLeft;

usually i am following above style. I am not sure this the answer...

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

此处描述了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();
});