Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, Serginio1, Вы писали:
S>> Ну к этому времени и JS будет совсем другим. Добавили модульность, async await. Linq прикручивают http://www.javascriptlinq.com/ S>> Правда типизация пока только в TS.
_>Очаровательный сайтик — даже навигация (меню и ссылки) работает только в 1/3 случаев. Даже боюсь представить что они там предлагают в своих библиотеках.
Ну это первая попавшаяся ссылка есть и другие реализации https://github.com/kutyel/linq.ts https://github.com/kutyel/linq.ts/blob/master/test/list.ts
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Somescout, Вы писали:
S>Как бы сказать: без документации понять почему так происходит не просто. То есть когда о такое уже спотыкался, всё понятно, но в первый раз(ы) — WTF?
Вот еще:
> const arr = new Array(4);
[undefined, undefined, undefined, undefined]
<tr *ngFor="let rows of RowsRange; let row = index">
<td *ngFor="let col of ColsRange; let i = index">
<input type="text" (keypress)="KeyPress($event,Puzzle[row*9+i].value)" (click)="Click(Puzzle[row*9+i])" [class.IsFocused]="Puzzle[row*9+i].IsFocused"
[(ngModel)]="Puzzle[row*9+i].value" [disabled]="Puzzle[row*9+i].disabled" size="3" maxlength="1">
</td>
</tr>
export class SudokuComponent {
RowsRange = new Array(9);
ColsRange = this.RowsRange;
и солнце б утром не вставало, когда бы не было меня
S> <tr *ngFor="let rows of RowsRange; let row = index">
S> <td *ngFor="let col of ColsRange; let i = index">
S> <input type="text" (keypress)="KeyPress($event,Puzzle[row*9+i].value)" (click)="Click(Puzzle[row*9+i])" [class.IsFocused]="Puzzle[row*9+i].IsFocused"
S> [(ngModel)]="Puzzle[row*9+i].value" [disabled]="Puzzle[row*9+i].disabled" size="3" maxlength="1">
S> </td>
S> </tr>
S>
Это уже другое убожество. Индус-трия запуталась в собственных соплях и через 15 лет вернулась к ASP с первыми php4-шаблонизаторами. Синдром NotInventedHere в исполнении гугла.
Ожидаем в ближайшие пару лет изобретения WebForms и WebComponents. Собственно компоненты они уже пытаются изобретать во втором Ангуляре(или уже 5м?6м?слегка отстал от новостей(
Здравствуйте, StandAlone, Вы писали:
SA>Здравствуйте, Serginio1, Вы писали:
S>>
S>> <tr *ngFor="let rows of RowsRange; let row = index">
S>> <td *ngFor="let col of ColsRange; let i = index">
S>> <input type="text" (keypress)="KeyPress($event,Puzzle[row*9+i].value)" (click)="Click(Puzzle[row*9+i])" [class.IsFocused]="Puzzle[row*9+i].IsFocused"
S>> [(ngModel)]="Puzzle[row*9+i].value" [disabled]="Puzzle[row*9+i].disabled" size="3" maxlength="1">
S>> </td>
S>> </tr>
S>>
SA>Это уже другое убожество. Индус-трия запуталась в собственных соплях и через 15 лет вернулась к ASP с первыми php4-шаблонизаторами. Синдром NotInventedHere в исполнении гугла. SA>Ожидаем в ближайшие пару лет изобретения WebForms и WebComponents. Собственно компоненты они уже пытаются изобретать во втором Ангуляре(или уже 5м?6м?слегка отстал от новостей(
Так это и есть Angular 2. Только это ближе к Razor, но на клиенте.
Сейчас сервер только выдает получает данные в виде JSON. DOM строится на клиенте.
[(ngModel)]="Puzzle[row*9+i].value"
это двухсторонняя привязка. То есть изменения Puzzle[row*9+i].value вне input отразятся в input, а при изменении в input изменится и value объекта.
Что касается
[class.IsFocused]="Puzzle[row*9+i].IsFocused"
то изменяется класс IsFocused при изменении свойства IsFocused объекта.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, anonymous, Вы писали:
A>Вероятно это зависит от реализации, но по стандарту: A>что не то же самое.
А в чем принципиальная разница? И почему, как здесь рядом подсказали, в цикле индексы есть? Я правильно понимаю, что понять этого нельзя, нужно тупо запомнить?
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
A>>Вероятно это зависит от реализации, но по стандарту: A>>что не то же самое. Ops>А в чем принципиальная разница? И почему, как здесь рядом подсказали, в цикле индексы есть? Я правильно понимаю, что понять этого нельзя, нужно тупо запомнить?
Тут дело в том, как устроен массив в JS: это объект с полем length и полями с именами 0, 1, 2 и так далее, то есть индексы это не смещения, а названия полей. Когда создаётся массив длиной, например, 4, в поле length записывается значение 4, а поля 0, 1, 2 и 3 не создаются вообще, а не только не инициализируются. Я не знаю, как работает map, но могу предположить, что он бежит от 0 до length не включительно, и если поля с соответствующим названием-индексом нет, то переходит к следующей итерации, не вызывая колбек. В результате получается массив той же длины и снова без полей-индексов.
И в цикле индексов нет тоже:
for (var i in new Array(4)) { console.log(i) }
ничего не выведет.
Разве что так:
var a = new Array(4);
for (var i = 0; i < a.length; i++) { console.log(i) }
Но тут индекс берётся из внешнего по отношению к массиву источника.
Здравствуйте, Ops, Вы писали:
Ops>А в чем принципиальная разница? И почему, как здесь рядом подсказали, в цикле индексы есть? Я правильно понимаю, что понять этого нельзя, нужно тупо запомнить?
Я в ужасе покрываюсь липким потом. Схожу с ума, или вы прикидываетесь?
Вы вообще о чем, какие циклы?
В каком цикле? В том, что Serginio1 притащил? Там нет никаких циклов! Это директива сраного Ангуляра.
Зачем он постоянно тащит сюда, в обсуждение JS, всякие какашки, типа ангуляра или майкрософтовской правотипной отрыжки решительно непонятно.
А директива, джентльмены, это совсем не языковая фича. Это что-то вроде вот такого.
var ngIfDirective = ['$animate', '$compile', function($animate, $compile) {
return {
multiElement: true,
transclude: 'element',
priority: 600,
terminal: true,
restrict: 'A',
$$tlb: true,
link: function($scope, $element, $attr, ctrl, $transclude) {
var block, childScope, previousElements;
$scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
if (value) {
if (!childScope) {
$transclude(function(clone, newScope) {
childScope = newScope;
clone[clone.length++] = $compile.$$createComment('end ngIf', $attr.ngIf);
// Note: We only need the first/last node of the cloned nodes.
// However, we need to keep the reference to the jqlite wrapper as it might be changed later
// by a directive with templateUrl when its template arrives.
block = {
clone: clone
};
$animate.enter(clone, $element.parent(), $element);
});
}
} else {
if (previousElements) {
previousElements.remove();
previousElements = null;
}
if (childScope) {
childScope.$destroy();
childScope = null;
}
if (block) {
previousElements = getBlockNodes(block.clone);
$animate.leave(previousElements).done(function(response) {
if (response !== false) previousElements = null;
});
block = null;
}
}
});
}
};
}];
Шик, блеск, красота, не правда ли?! Я ж говорил, что JS хороший язык, он позволяет отложить много отличного компактного кода, совсем как старый добрый С!
Здравствуйте, Serginio1, Вы писали:
S>Так это и есть Angular 2.
Да неужели. Кто бы мог подумать!
S>Только это ближе к Razor, но на клиенте.
Отличная шутка, Евгений Ваганович! Razor, ну конечно же, как же, не иначе. А фанерный кукурузник это что-то ближе к Space Shuttle, но на совхозном поле.
S> то изменяется класс IsFocused при изменении свойства IsFocused объекта.
Здравствуйте, StandAlone, Вы писали:
SA>Вы вообще о чем, какие циклы? SA>В каком цикле? В том, что Serginio1 притащил? Там нет никаких циклов! Это директива сраного Ангуляра.
Ну я не сильный JS-писатель, не знаю нюансов, думал, что так теперь принято на нем писать, а прочитать и разобраться в том ужасе, каюсь, не осилил, поверил на слово
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, anonymous, Вы писали:
A>Тут дело в том, как устроен массив в JS: это объект с полем length и полями с именами 0, 1, 2 и так далее, то есть индексы это не смещения, а названия полей. Когда создаётся массив длиной, например, 4, в поле length записывается значение 4, а поля 0, 1, 2 и 3 не создаются вообще, а не только не инициализируются. Я не знаю, как работает map, но могу предположить, что он бежит от 0 до length не включительно, и если поля с соответствующим названием-индексом нет, то переходит к следующей итерации, не вызывая колбек. В результате получается массив той же длины и снова без полей-индексов.
Понятно. Массив есть, ненулевой длины, элементов нет, и индексов нет, но длина есть. Все ясно, просто и логично.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Здравствуйте, Ops, Вы писали:
Ops>Понятно. Массив есть, ненулевой длины, элементов нет, и индексов нет, но длина есть. Все ясно, просто и логично.
Более того — движки выделяют память реальную и кусками, а JS-блудники ещё и хотят всяких Int32Array. Возникает резонный вопрос — что такое array, когда он разрежен, а когда нет, и зачем им вдруг нужны типы?
Я рад за то, что Angular 2 привел тебя в восторг.
На самом деле это компонент с привязками с дочерними компонентами и родительским
Но это аналогично и WPF. Там иногда еще страшнее.
Обычно такой код соответствует универсальным компонентам.
Используй готовые компоненты http://www.primefaces.org/primeng/#/
Главное, что ты не работаешь с DOM напрямую. Только декларативно.
Ты кстати программировал на Angular 2?
Кстати статья написана всего после 2 х недель изучения Angular 2.
Ты один из тех, кто судит о Паваротти о том как Рабинович напел?
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, Ops, Вы писали:
Ops>Понятно. Массив есть, ненулевой длины, элементов нет, и индексов нет, но длина есть. Все ясно, просто и логично.
Не просто, но логика в этом определённая есть. И главное — ты вряд ли столкнёшься с этой особенностью. Пример выше искусственен, получать массив индексов с помощью map — зачем?
Здравствуйте, Mystic Artifact, Вы писали:
Ops>>Понятно. Массив есть, ненулевой длины, элементов нет, и индексов нет, но длина есть. Все ясно, просто и логично. MA> Более того — движки выделяют память реальную и кусками, а JS-блудники ещё и хотят всяких Int32Array. Возникает резонный вопрос — что такое array, когда он разрежен, а когда нет, и зачем им вдруг нужны типы?
Int32Array — это array-like объект, который не имеет отношения к Array, это буфер с иным поведением. Так же объект Arguments, который хранит аргументы функции, похож по интерфейсу на Array, но не связан с ним. Они все похожи лишь наличием поля length и полей-индексов.
Здравствуйте, neFormal, Вы писали:
I>>Они как раз были рабочие. Флеш до сих пор в нише. Аплеты держались до 10го года. F>флэш не в нише интерфейсов. игрушки на нём делали, да и сейчас делают. потому что удобно графоний натягивать.
Флеш во все времена был в нише интерфейсов. Именно потому и в играх он взлетел.
F>а апплеты держались вплоть до отключения nsplugins в бравзерах. потому что разные банки любили их использовать. в остальных сферах они померли.
I>>Питон работал в браузере, его не надо было встраивать.
F>а когда это было?
Гдето в районе нулевых
I>>Мы встраивали питон в своё приложение, кстати говоря, он быстро отгнил, практически мгновенно.
F>что за приложение было? какое применение питона?
Навроде САПР. Три семейства продуктов или даже четыре, я уже не помню. Полная автоматизация приложения, юзер может как в MS Office, написать всё что угодно на скрипте, вызвать любую публичную функцию приложения и тд.
F>>>в приложениях типа игр js практически не встречается. I>>Это не так. Не в большинстве случаев, но есть. Я даже писал расширения на ём.
F>поделись историями успеха.
Здравствуйте, StandAlone, Вы писали:
SA>В каком — этом??? Любая машина со временем превращается в опель, любое приложение на JS, который сложнее Hello world, превращается в набор из показанных мной компактных личинок. SA>Write-only код, написан чукчей-нечитателем, неподдерживаем в принципе.
Отладка промисов никакого отношения к этому не имеет. Можно подумать один ты имеешь дело с кодом такого чукчи.
SA>Именно об этой фиче нашего простого языка мы тут и разговариваем.
Здравствуйте, neFormal, Вы писали:
I>>Проектирование всегда занимает на порядок больше времени, если ты конечно не тривиальные задачи чпокаешь.
F>больше, чем кодирование? ты там алгоритмы кодирования на js пишешь, что у тебя текста мало?
Больше. Кодинг это просто набор текста. 1мб текста набирается за смешное количество времени. С учетом помощи IDE, копипасты так и вовсе время 0. А чем ты занят останое количество времени ?
F>>>но в данном примере особого сокращения нет. это не экономия на спичках, это бОльшая выразительность кода. I>>Все эти неявные фокусы вылазят боком при правильном тестировании.
F>во1х, это явное указание
Врёшь. Ты не знаешь, сколько аргументов из необязательных будут использованы. Следовательно — неявное.
F>во2х, тестирование от этого не страдает. или показывай пример.
Страдает читаемость и сопровождение.
F>да хоть что. код становится проще, читабельней, хорошо поддаётся правке.
Читабельно, это когда связи видны. А ты их собтвенно и прячешь.