2016-11-29 7 views
1

Пожалуйста, помогите мне в этом вопросе.Угловая проверка 1.5 '' & binding 'is null

У меня есть угловая 1.5 компонента с помощью «& связывания»:

app.component('foo', { 
    bindings: { 
     message: '<' 
     onSomething: '&' 
    }, 
    template:'<div>blah blah</div>', 
    controller: function() { 
     var ctrl = this; 
     ctrl.myOperation = function() { 
      ctrl.onSomething(); // <= look this! 
     } 
    } 
}); 

И я хотел бы проверить, если «onSomething» определен.

В самом деле, если я использую его следующим образом:

<foo message='my message' on-something='doSomething()'></foo> 

все в порядке.

Но если я использую его следующим образом:

<foo message='my message'></foo> 

«onSomething» не должны быть определены, , но я не в состоянии проверить это!

Я пробовал:

if (ctrl.onSomething) ... 
if (ctrl.onSomething == undefined) ... 
if (ctrl.onSomething == null) ... 
if (angular.isDefined(ctrl.onSomething) 

все эти тесты всегда возвращаются «истина», даже когда не был принят обратный вызов.

+0

Довольно уверен, что вы можете изменить '«&» 'в'«? &» ', И тогда вы увидите' ctrl.onSomething === null' – abyx

ответ

2

Они возвращают true, потому что ctrl.onSomething является функцией крюка для инициирования обратного вызова, объявленного в экземпляре компонента. Он всегда будет правдой. Вместо этого попробуйте ввести в ваш контроллер $attrs и нуль-проверить его.

function($attrs){ 
    var ctrl = this; 
    ctrl.myOperation = function(){ 
     if($attrs.onSomething){ .... } 
    } 
} 
+1

Это происходит, когда кто-то изучает технологии слишком быстро: я не знал $ attr. Спасибо! –

+1

Есть тонкие различия между ними. директива и компонент, в основном в том, как добавляется контроллер и когда. Поскольку вы не получаете функцию связывания в компоненте, они добавили сервисы $ element и $ attrs для компонента, который должен быть введен для достижения той же функциональности, что и в функции ссылки директивы. – jusopi