angularjs - свойство недоступно при вызове функции ссылки
Я пишу директиву.
Это код, который я использую:
angular.module('weather', []).directive('myWeather', [
'$ionicSideMenuDelegate', function($ionicSideMenuDelegate) {
var createWeatherConditionLabel, linkFunction;
createWeatherConditionLabel = function(type) {
var label;
label = '';
debugger;
switch (type) {
case 0:
label = 'Clear';
break;
case 1:
label = 'Clear';
break;
case 2:
label = 'Light Cloud';
break;
case 3:
label = 'Light Cloud';
break;
case 5:
label = 'Windy';
break;
case 6:
label = 'Foggy';
break;
case 7:
label = 'Cloudy';
break;
case 15:
label = 'Rain';
break;
case 18:
label = 'Sleet';
break;
case 21:
label = 'Hail';
break;
case 27:
label = 'Snow';
break;
case 30:
label = 'Showers';
}
return label;
};
linkFunction = function(scope, el, attr) {
console.log("scope:", scope);
scope.showWeatherDetails = false;
scope.evtClickExpandMenuWeather = function() {
if (scope.showWeatherDetails === false) {
return scope.showWeatherDetails = true;
} else {
return scope.showWeatherDetails = false;
}
};
scope.$watch((function() {
return $ionicSideMenuDelegate.isOpenRight();
}), function(isOpen) {
if (!isOpen) {
return scope.showWeatherDetails = false;
}
});
return scope.weatherLabel = createWeatherConditionLabel(scope.weatherType);
};
return {
restrict: 'E',
replace: true,
templateUrl: './directives/tpl.html',
scope: {
weatherData: "=",
weatherType: "="
},
link: linkFunction
};
}
]);
и директива называется так:
<my-weather weather-data="zones[0].weatherData" weather-type="zones[0].weatherData.weather_type"></my-weather>
Мне нужно вызвать функцию для создания weatherLabel
и использовать это в шаблоне директивы, но я не могу, потому что scope.weatherType не определен.
Как я могу дождаться определения области, прежде чем вызывать функцию ссылки?
или есть лучший и эффективный (с точки зрения производительности) способ сделать это? большое спасибо за любую помощь
2 ответа
1-й способ: <my-weather ng-if="zones[0].weatherData.weather_type" ...
так что ваша директива не запускается до тех пор, пока переменная не будет разрешена.
2-й способ: используйте watch на 'weatherType' в директиве и обновите свой ярлык.
PS твой переключатель классный, но лучше init map т.е.
var LABELS = {0 : '...', 1 : '...', ...}
и просто получить ярлык из него.
Вы используете двунаправленную область привязки изолята. Док говорит:
= or = attr - установить двунаправленную привязку между локальным свойством области видимости и выражением, переданным через атрибут attr. Выражение оценивается в контексте родительской области. Если имя атрибута не указано, то предполагается, что имя атрибута совпадает с локальным именем.
Какое значение зоны [0].weatherData.weather_type в вашем контроллере? Если это свойство не определено, scope.weatherType в вашей директиве тоже не определено.
Я написал пример на плункер. Вы видите, как работает двунаправленная привязка.
https://plnkr.co/edit/qK70Z1t1CLI0o5bV7a0Y
script.js
var appModule = angular.module('myApp', [])
.controller('testCtrl', ['$scope', function($scope) {
$scope.controllerScope = {
"message": "I am a two ways binding isolate scope"
};
}])
.directive('testDirective', function() {
return {
templateUrl: "directive-tpl.html",
replace: true,
restrict: "E",
scope: {
directiveScope: "="
},
link: function(scope) {
console.log(scope.directiveScope.message);
}
}
});
index.html
<!DOCTYPE html>
<html ng-app='myApp'>
<head>
<script data-require="angularjs@1.5.5" data-semver="1.5.5" src="https://code.angularjs.org/1.5.5/angular.js"></script>
<link rel="stylesheet" href="style.css" />
<script src="script.js"></script>
</head>
<body ng-controller='testCtrl'>
<p>TEST ISOLATE SCOPE</p>
<p>This is controllerScope:</p>
<p>{{controllerScope}}</p>
<test-directive directive-scope='controllerScope'></test-directive>
</body>
</html>
Директива-tpl.html
<div>
<p>Hello! I am the template of test-directive</p>
<p>In my scope i have this: </p>
<p>{{directiveScope}}</p>
</div>