我是一个新手开始使用角度材料。我正在边栏工作。
基本上,就像
<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的赋值不会立即执行?然后什么时候执行?
答案 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();
});