Я переместил свой простой пейджинг с контроллера на директиву и застрял в странной проблеме. Каждый раз, когда я обновляю родительскую область из директивы, она обновляется только при следующем изменении. Поэтому, если ng-options - [10,20,30], а I ng - изменить его на 10 - ничего не происходит. Затем я меняю его на 20, и он обновляется до предыдущего значения 10, следующее изменение на любое значение получает обновленную модель до той, которую я выбрал до ... и т. Д.Директива обновляет родительскую область на один шаг задерживается
Я только недавно начал использовать директивы и перемещение вещей от контроллера, поэтому я мало знаю об этом (пожалуйста, у меня со мной). Я пытался использовать $ scope. $ Apply, но это не помогает. Я все еще получаю задержанные обновления. Что мне не хватает? Я понимаю, что это связано с обновлением дайджеста и $ scope. $ Apply, но я не могу понять, где его использовать. Все, что я пробовал, просто не работает.
Соответствующие части контроллера:
vm.pages = 0;
vm.articles = [];
vm.load = { page: { batch: 10, current: 1 }
, sort: { _id: -1 }
, filter: {}
};
vm.getArticles = function() {
articleS.list(vm.load, function (data){
vm.pages = data.pages;
vm.articles = data.articles;
});
}
директива:
.directive("paging", function() {
var scope = { update: '&', current: '=', pages: '=', batch: '=' };
function link(s, e, a) {
s.options = [10,20,50,100];
s.toPage = function(p) {
switch(p) {
case "last":
if (s.current != s.pages) {
s.current = s.pages;
s.update();
}
break;
case "next":
if (s.current < s.pages) {
s.current ++;
s.update();
}
break;
case "prev":
if (s.current > 1) {
s.current --;
s.update();
}
break;
default:
s.current = 1;
s.update();
}
}
}
return {
replace: true,
scope: scope,
templateUrl: 'paging.tpl',
link: link
}
});
Шаблон директивы:
<section class='pages'>
<select
ng-model="batch"
ng-change="toPage('first')"
ng-options="value for value in options">
</select>
<div>
<button ng-click="toPage('first')"> 1 </button>
<button ng-click="toPage('prev')"> << </button>
<div>{{current}}</div>
<button ng-click="toPage('next')"> >> </button>
<button ng-click="toPage('last')"> {{pages}} </button>
</div>
</section>
Директива вызова:
<paging
update="vm.getArticles()"
current="vm.load.page.current"
batch="vm.load.page.batch"
pages="vm.pages">
</paging>
Большое спасибо
попробуйте использовать $ scope. $ Apply() перед s.update(); предложение в директиве – Anita
@ Анита Это первое, что я пробовал - не повезло. Разве не '=' в изолированной области действия должен заботиться о двухсторонней привязке? –
'=' создает область выделения, поэтому он делает только один способ привязки. Вы можете попробовать '&' вместо '='. – Anita