я написал довольно простой тест приложение следующим образом:обновление данных между контроллером, обслуживание и директивы
angular.module('tddApp', [])
.controller('MainCtrl', function ($scope, $rootScope, BetslipService) {
$scope.displayEvents = [
{
id: 1,
name: 'Belarus v Ukraine',
homeTeam: 'Belarus',
awayTeam: 'Ukraine',
markets: {home: '2/1', draw: '3/2', away: '5/3'},
display: true
}
];
$scope.betslipArray = BetslipService.betslipArray;
$scope.oddsBtnCallback = BetslipService.addToBetslip;
$scope.clearBetslip = BetslipService.clearBetslip;
})
.directive('oddsButton', function() {
return {
template: '<div class="odds-btn">{{market}}</div>',
replace: true,
scope: {
market: '@',
marketName: '@',
eventName: '@',
callback: '&'
},
link: function (scope, element) {
element.on('click', function() {
scope.callback({
name: scope.eventName,
marketName: scope.marketName,
odds:scope.market
});
});
}
};
})
.factory ('BetslipService', function ($rootScope) {
var rtnObject = {};
rtnObject.betslipArray = [];
rtnObject.addToBetslip = function (name, marketName, odds) {
rtnObject.betslipArray.push({
eventName: name,
marketName: marketName,
odds: odds
});
};
rtnObject.clearBetslip = function() {
rtnObject.betslipArray = [];
};
return rtnObject;
});
Я назначен массив в переменной контроллера. Я также назначил функции для изменения массива. Чтобы добавить объект в массив, обратный вызов вызывается директивой с областью выделения. Происходит какое-то странное поведение, которое я не совсем понимаю:
=> щелчок по директиве выполняет обратный вызов в службе. Я сделал некоторую отладку, и кажется, что переменная контроллера обновлена, но она не отображается в html. => нажатие кнопки для очистки массива работает не так, как ожидалось. В первый раз он вызывает отображение элемента, после чего он не действует.
Я думаю, что это, возможно, придется делать с вложенными нг-повторы создают свои собственные областей
NB
Я установил массив не очищая путем изменения функции в службе:
while (rtnObject.betslipArray.length > 0) {
rtnObject.betslipArray.pop();
}
// instead of
rtnObject.betslipArray = [];
Это имеет смысл, поскольку служебная переменная была указана на новый объект, в то время как старая ссылка сохранялась в контроллере.
Я получил html для обновления путем переноса обратного вызова в директиве в области. $ Apply(). Эта часть, которую я действительно не понимаю. Каким образом область действия. $ Apply(), вызываемая в директиве, влияет на область контроллера, когда директива имеет область выделения? обновлено скрипку: http://jsfiddle.net/b6ww0rx8/7/
Любая мысль-х высоко оценили
jsfiddle: http://jsfiddle.net/b6ww0rx8/5/
C
Я на самом деле добавить 'console.log' заявления в вашей службе и часы заявление в контроллере для массива, и я что ваш контроллер не обновляется. Массив в службе - это не контроллер. –
Я сделал аналогичный тест. Я не уверен, почему часы $ не собирают это, но если я назначу область управления переменной переменной в службе и зарегистрирую ее как http://jsfiddle.net/b6ww0rx8/6/, она выглядит как контроллер обновляется – Cathal
Вы добавляете ресурс и занимаете много времени в цикле, чтобы усечь ваш массив?Кроме того, вы используете 'pop()' в своем массиве, чтобы полностью удалить элементы, что также связано с затратами? 'array.length = 0', одна строка отсутствует, нет времени сосать. Что произойдет, если у вас есть тысячи элементов в этом массиве? Ваш цикл while может занять слишком много времени и повесить ваше приложение. –