Изменение модели в директиве
В директиве используется ng-model. Нужно чтобы при определенном событии на элементе (пусть при щелчке для примера) менялся параметр первого элемента модели. Есть два варианта, как это сделать:
require: '?ngModel',
link: function (scope, element, attrs, ngModel) {
element.bind('someevent', function (e) {
//1 вариант
if (typeof ngModel.$modelValue === 'object') {
ngModel.$modelValue[0].active = true
ngModel.$setViewValue(ngModel.$modelValue)
scope.$apply()
}
//2 вариант
if (typeof scope[attrs.ngModel] === 'object') {
scope[attrs.ngModel][0].active = true
scope.$apply()
}
})
})
Оба варианта работают, тем не менее, какой предпочтительней? Но работают они не всегда. При первой загрузке они уже и так находятся в цикле $digest (соответственно, $apply не нужен) и тут проблема: срабатывают они через раз. Т.е. вид может обновиться, а может и нет, как повезет. Какие есть мысли по этому поводу? |
Цитата:
Цитата:
<!DOCTYPE html>
<html id="ng-app" ng-app="app"> <!-- id="ng-app" IE<8 -->
<head>
<title>sandbox</title>
<script src="http://code.angularjs.org/1.1.5/angular.min.js"></script>
<script>
angular
.module( 'directives', [])
.directive( 'ngMy', function() {
return {
scope: {
callback: '&'
},
link: function( $scope, $element ) {
$element.bind( 'click', function() {
console.log( 1 );
$scope.callback();
});
}
};
});
var app = angular.module( 'app', [ 'directives' ]);
app.controller( 'MainController', function( $scope, $http ) {
$scope.fn = function() {
console.log( 2 );
};
});
</script>
</head>
<body ng-controller="MainController">
<div ng-my callback="fn()" style="background-color: lavender; height: 100px;">
click on this element and see in console
</div>
</body>
</html>
|
Там большой джикверевский плагин, не могу пример показать... Эмулировать $digest никак не получилось, зато получилось с $apply.
Пример: http://plnkr.co/edit/MxCFH5WzUBAdbEuMRBH2?p=preview Смысл в том, что при загрузке обновляется модель и $apply запущен, но в вид не обновляется. |
Продвинулся дальше в понимании причин http://stackoverflow.com/questions/1...e-in-angularjs
Сорри, что на английском, уже нет сил переводить. |
Начну с того, что я не понимаю, зачем ты пытаешься обновить модель в директиве. Директивы для работы с DOM. С моделью работают контроллеры.
Зачем директива ng-model помещена внутрь элемента div? <div my-directive ng-model="model"></div> Нужна ли она вообще в данном случае? http://stackoverflow.com/questions/1...el-and-ng-bind |
Это выхолощенный пример. Предыдущий был ближе к реальности. Директива отвечает за показ и управление списком элементов (слайдшоу) через jQuery-плагин. Один из элементов должен быть активным. Список элементов берется из ng-model, но если активный элемент меняется, то модель должна обновляться. Стандартная директива option обновляет же модель.
|
Пример на фазы жизненного цикла http://plnkr.co/edit/cMH4WIezzw6SNyuLYzrm?p=preview
|
| Часовой пояс GMT +3, время: 09:44. |