powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication
25 сообщений из 73, страница 2 из 3
Single page aplication
    #38934588
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Пожалуйста
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
export = Index;
import Roles = require("CurrentUser/Roles");
import HomeIndex = require("Home/Index");
import FavoritesSelector = require("Favorites/FavoritesSelector");

class Index extends ssp.IndexForm {
    directions = new ssp.DataSource({ url: "api/MessageTaskApi/GetDirections" });
    categories = new ssp.DataSource({ url: "api/MessageTaskApi/GetCategories" });
    projects = new ssp.DataSource({ url: "api/MessageTaskApi/GetProjects" });
    states = new ssp.DataSource({ url: "api/MessageTaskApi/GetStates" });
    favorites = new ssp.DataSource({ url: "api/MessageTaskApi/GetFavorites" });
    roles = new Roles();
    table: ssp.Table;

    constructor(parameters?) {
        super({
            templateUrl: ssp.url.getViewUrl("MessageTask/Index"),
            indexApiController: "api/MessageTaskApi",
            excelApiController: "api/MessageTaskExcelApi",
            editApiController: "api/MessageTaskEditApi",
            getRowID: row => row.ID,
            getRowName: row => row.Subject,
            dataConverter: data => {
                $.each(data.PageRows || [], (i, row) => {
                    row.IsTaskNotReaded = ko.observable(row.IsTaskNotReaded);
                });
            },
            filterConverter: filter => {
                var p = parameters || {};

                if (p.notReaded) {
                    filter.FilterType(0); // Текущие задачи
                    filter.F0_Category(1); // Непрочитанные
                    filter.F0_Direction(0); // Все задачи                    
                }
            }
        });

        var columns = [
            new ssp.TableColumn({
                header: "Тема",
                cellClass: row => "taskContent",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var c = new ssp.Control({ templateName: "messageTask-index-taskContent-template" });
                    c["data"] = row;
                    c["parent"] = this;
                    return c;
                }                
            }),
            new ssp.TableColumn({
                header: "Дата",
                tooltip: "Дата постановки задачи или последнего комментария.",
                propertyName: "ActivityDate",
                formatter: ssp.formatters.dateTime,
                cellClass: row => "auto-width"
            }),
            new ssp.TableColumn({
                header: "Постановщик",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Sender;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Исполнитель",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => {
                    var member = row.Recipient;
                    return new ssp.Label(member.Name, member.IsMe ? ssp.Brands.Default : null);
                }
            }),
            new ssp.TableColumn({
                header: "Состояние",
                cellClass: row => "auto-width",
                cellContentType: ssp.TableCellContentTypes.ContentModel,
                cellContent: row => new ssp.Label(row.CurrentStateStr, row.IsActive ? ssp.Brands.Success : ssp.Brands.Default)
            }),
            new ssp.TableColumn({
                header: "Проект",
                propertyName: "ProjectStr"
            })
        ];

        $.each(columns, (i, column) => {
            column.canSort = false;
        });

        var contextMenu = new ssp.GroupMenuItem({
            template: ssp.groupMenuItemTemplates.button,
            items: [
                new ssp.UrlMenuItem({
                    header: "Подробно",
                    url: row => row ? this.getDetailUrl(row) : ""
                }),
                new ssp.FuncMenuItem({
                    header: row => row ? row.IsTaskNotReaded() ? "Пометить как прочтённое" : "Пометить как непрочтённое" : "",
                    func: row => { this.inverseIsTaskReaded(row); },
                    isEnabled: row => row && row.MustReadMessage
                }),
                new ssp.SeparatorMenuItem({
                    isVisible: () =>
                        this.roles.isInRole(this.roles.appRoles.message_task) ||
                        this.roles.isInRole(this.roles.appRoles.message_task_delete)
                }),
                new ssp.UrlMenuItem({
                    header: "Изменить",
                    url: row => row ? ssp.url.getDocUrl("MessageTask/Edit", { id: this.getRowID(row) }) : "",
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить",
                    func: row => { this.delete(row); },
                    isVisible: () => this.roles.isInRole(this.roles.appRoles.message_task_delete),
                    isEnabled: row => row && row.CanChangeMessage
                }),
                new ssp.SeparatorMenuItem(),
                new ssp.FuncMenuItem({
                    header: "Добавить в избранное",
                    func: row => { this.addToFavorite(row); }
                }),
                new ssp.FuncMenuItem({
                    header: "Удалить из избранного",
                    func: row => { this.deleteFromFavorite(row); },
                    isEnabled: () => {
                        var filter = this.filter.result();
                        return filter && filter.FilterType() == 1 /*Избранное*/ && filter.F1_FavID()
                    }
                })
            ]
        });

        this.table = new ssp.Table({
            addUrl: ssp.url.getDocUrl("MessageTask/Edit"),
            isAddVisible: () => this.roles.isInRole(this.roles.appRoles.message_task),
            dataSource: this.data,
            columns: columns,
            contextMenu: contextMenu
        });
    }

    getDetailUrl(row) {
        return ssp.url.getDocUrl("MessageTask/Detail", { id: row.ID });
    }

    inverseIsTaskReaded(row) {
        ssp.ajax
            .postJson("api/MessageApi/SetMessageReadedByID", { ID: this.getRowID(row), IsReaded: row.IsTaskNotReaded() })
            .done(() => {
                row.IsTaskNotReaded(!row.IsTaskNotReaded());
                HomeIndex.model.notReadedAlert.refresh();
                this.data.refreshImmediate();
            });
    }

    addToFavorite(row) {
        new FavoritesSelector()
            .select(selectedItem => {
                return ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/AddToFavorite", { TaskID: row.ID, FavID: selectedItem.ID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }

    deleteFromFavorite(row) {
        var favID = this.filter.result().F1_FavID();
        var favCaption = "";

        $.each(this.favorites.result() || [], (i, v) => {
            if (v.ID == favID) {
                favCaption = v.Caption;
                return false;
            }
        });

        var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

        ssp.commonDialogs
            .ask(msg)
            .done(() => {
                ssp.ajax
                    .postJson("api/MessageTaskFavoritesApi/DeleteFromFavorite", { TaskID: row.ID, FavID: favID })
                    .done(() => { this.data.refreshImmediate(); });
            });
    }
}

Очередной Smart UI.MVVM.
...
Рейтинг: 0 / 0
Single page aplication
    #38934594
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы: Всегда удивляли подобные взгляды на происходящее. Некоторые считают, что если разделить программу на XXX слоёв, то она автоматически станет лучше. Бред какой-то...
...
Рейтинг: 0 / 0
Single page aplication
    #38934607
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAОчередной Smart UI.

Тут лапша обыкновенная, Stupid Fat UI, всё перемешано и навалено в кучу, так примерно чуть продвинутые студенты свои лабы пишут.

Даже KnockoutJS не спасает, приходится лепить казюльки типа:

Код: javascript
1.
2.
3.
$.each(columns, (i, column) => {
            column.canSort = false;
        });



Какие уж там логика отдельно, представление отдельно... Единственно, есть зачатки декомпозиции (типы из ssp), но всё равно выглядит как жестокое издевательство, если планируется это сопровождать. Если ж это ПО с коротким циклом жизни и с одним пожизненным разрабом с безупречной памятью, то ОК, сойдёт и так
...
Рейтинг: 0 / 0
Single page aplication
    #38934608
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Очередной Smart UI.MVVM.На MVVM не тянет.
...
Рейтинг: 0 / 0
Single page aplication
    #38934610
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Всегда удивляли подобные взгляды на происходящее. Некоторые считают, что если разделить программу на XXX слоёв, то она автоматически станет лучше. Бред какой-то...Зачем на трёхзначное число слоёв?
...
Рейтинг: 0 / 0
Single page aplication
    #38934612
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Кзы: Всегда удивляли подобные взгляды на происходящее. Некоторые считают, что если разделить программу на XXX слоёв, то она автоматически станет лучше. разделение нужно не для абстрактной лучшести, а для конкретного удобства совместной разработки и поддержки. да и индивидуальной тоже.
Алексей КБред какой-то...а статья действительно не фонтан.
...
Рейтинг: 0 / 0
Single page aplication
    #38934615
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КMVVM.

не обманывай себя

такое тянет только на прототип, который оч. быстро накидали, чтобы хоть что-то быстренько показать. для ПО с длительным жизненным циклом такое УГ писать -- это преступление. но где-то на это закрывают глаза (или не открывают вовсе), содержат разрабов, которые совершенно наплевательски относятся к разработке. если такой разраб устаивает работодателя, которому скорее всего до фени чё там и как пишется, да хоть задницей, ну тогда и отличненько. нормальный жизнеспособный тандем
...
Рейтинг: 0 / 0
Single page aplication
    #38934618
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсли ж это ПО с коротким циклом жизни и с одним пожизненным разрабом с безупречной памятью, то ОК, сойдёт и такУ них всегда будет 11 разработчиков. Никто не придёт и не уйдёт. Да и в остальном ничего меняться не будет. :) Давно же уже выяснили.
...
Рейтинг: 0 / 0
Single page aplication
    #38934634
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyАлексей Кзы: Всегда удивляли подобные взгляды на происходящее. Некоторые считают, что если разделить программу на XXX слоёв, то она автоматически станет лучше. разделение нужно не для абстрактной лучшести, а для конкретного удобства совместной разработки и поддержки. да и индивидуальной тоже.В данном конкретном случае, я бы добавил.

Программа разделена на функциональные модули, реализующие каждый свою предметную область. Нужно обязательно выработать стандарт, согласно которого будут оформляться функциональные модули, для упрощения их интеграции между собой. Например, в WPF удобно представлять модули в виде UserControl.

Внутри каждого модуля уже можно выделять различные системные слои (M, V, C, VM и т. п.), но по необходимости, чтобы не нарваться на недостаточную ответственность классов и лишнее делегирование.
...
Рейтинг: 0 / 0
Single page aplication
    #38934647
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVostt, skyANA

Не парьтесь, в таком ключе разговора у нас не получится.
...
Рейтинг: 0 / 0
Single page aplication
    #38934678
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, skyANA

Не парьтесь, в таком ключе разговора у нас не получится.Да никто и не парится.

Где у тебя разделение на M, V, C, и VM?
...
Рейтинг: 0 / 0
Single page aplication
    #38934682
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КhVostt, skyANA

Не парьтесь, в таком ключе разговора у нас не получится.

А никто не парится. KnockoutJS не является SPA фреймворком, это факт. Однако его можно успешно использовать в качестве реализации MVVM для SPA, например, с использованием Backbone или даже своего фреймворка, тоже факт. Но у тебя это сделать таким образом не получается. Ну без надобности оно тебе, тоже выяснили, а убеждать или переубеждать никого в чём-то смысла нет.
...
Рейтинг: 0 / 0
Single page aplication
    #38934691
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей КhVostt, skyANA

Не парьтесь, в таком ключе разговора у нас не получится.

А никто не парится. KnockoutJS не является SPA фреймворком, это факт. Однако его можно успешно использовать в качестве реализации MVVM для SPA, например, с использованием Backbone или даже своего фреймворка, тоже факт. Да?!
...
Рейтинг: 0 / 0
Single page aplication
    #38934695
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КВнутри каждого модуля уже можно выделять различные системные слои (M, V, C, VM и т. п.), но по необходимости, чтобы не нарваться на недостаточную ответственность классов и лишнее делегирование.То ты SRP придерживаться пытался, теперь вот про "недостаточную ответственность классов и лишнее делегирование" втирать начал.

Работу с сервером-то мог вынести в отдельный класс. Зачем представлению знать о том, что данные Ajax-ом запрашиваются по таким-то урлам?
Типа не достаточно отвечать только за UI? :)
...
Рейтинг: 0 / 0
Single page aplication
    #38934696
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КhVostt, skyANA

Не парьтесь, в таком ключе разговора у нас не получится.Да никто и не парится.

Где у тебя разделение на M, V, C, и VM?Там же, где и у всех остальных.
...
Рейтинг: 0 / 0
Single page aplication
    #38934699
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
Да никто и не парится.

Где у тебя разделение на M, V, C, и VM?Там же, где и у всех остальных.У всех остальных кого? Членов твоей команды?
...
Рейтинг: 0 / 0
Single page aplication
    #38934703
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей КВнутри каждого модуля уже можно выделять различные системные слои (M, V, C, VM и т. п.), но по необходимости, чтобы не нарваться на недостаточную ответственность классов и лишнее делегирование.То ты SRP придерживаться пытался, теперь вот про "недостаточную ответственность классов и лишнее делегирование" втирать начал.

Работу с сервером-то мог вынести в отдельный класс. Зачем представлению знать о том, что данные Ajax-ом запрашиваются по таким-то урлам?
Типа не достаточно отвечать только за UI? :)Это ViewModel, представление я не показывал, оно в HTML. Выносить обращения к серверу из ViewModel в отдельный класс в данном случае смысла не вижу.
...
Рейтинг: 0 / 0
Single page aplication
    #38934728
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
То ты SRP придерживаться пытался, теперь вот про "недостаточную ответственность классов и лишнее делегирование" втирать начал.

Работу с сервером-то мог вынести в отдельный класс. Зачем представлению знать о том, что данные Ajax-ом запрашиваются по таким-то урлам?
Типа не достаточно отвечать только за UI? :)Это ViewModel, представление я не показывал.А на мой взгляд это и ViewModel и View. Вот же диалог показывается (представление):
Код: javascript
1.
2.
3.
var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

ssp.commonDialogs.ask(msg)


Ну и templateUrl я не понял, что такое. Как используется?

Алексей КВыносить обращения к серверу из ViewModel в отдельный класс в данном случае смысла не вижу.А чем же у тебя занимается Model?
...
Рейтинг: 0 / 0
Single page aplication
    #38934740
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К Да?!

Ты сказал "на нём", что является очевидной глупостью. KnockoutJS никак не может быть основой для SPA, у него нет даже маршрутизации, а его самого надо инициализировать вручную как минимум через DOMContentLoaded событие. Так что не говори глупостей, вот и всё.
...
Рейтинг: 0 / 0
Single page aplication
    #38934755
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей Кпропущено...
Это ViewModel, представление я не показывал.А на мой взгляд это и ViewModel и View. Вот же диалог показывается (представление):
Код: javascript
1.
2.
3.
var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

ssp.commonDialogs.ask(msg)

Что мне мешает создать из ViewModel диалог? Используется "диалоговый" сервис commonDialogs, всё в лучших традициях.
skyANAНу и templateUrl я не понял, что такое. Как используется?URL откуда берётся HTML View.
skyANAАлексей КВыносить обращения к серверу из ViewModel в отдельный класс в данном случае смысла не вижу.А чем же у тебя занимается Model?Традиционно, модель хранит данные, получаемые с сервера. В примере их не видно.
...
Рейтинг: 0 / 0
Single page aplication
    #38934766
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttАлексей К Да?!

Ты сказал "на нём", что является очевидной глупостью. KnockoutJS никак не может быть основой для SPA, у него нет даже маршрутизации, а его самого надо инициализировать вручную как минимум через DOMContentLoaded событие. Так что не говори глупостей, вот и всё.Ну я понял, что ты тут самый самый специалист по SPA фреймворкам. Извини, что потревожил твои религиозные чувства.
...
Рейтинг: 0 / 0
Single page aplication
    #38934827
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КskyANAпропущено...
А на мой взгляд это и ViewModel и View. Вот же диалог показывается (представление):
Код: javascript
1.
2.
3.
var msg = "Задача будет исключена из категории избранного \"" + favCaption + "\". Продолжить?";

ssp.commonDialogs.ask(msg)

Что мне мешает создать из ViewModel диалог? Используется "диалоговый" сервис commonDialogs, всё в лучших традициях.А, это сервис :) Понятно. Почему же ajax в отдельный сервис не вынесен "в лучших традициях"?
На фига ViewModel знать, откуда данные (локальные, или с сервера получены ajax-ом, или не ajax-ом)?
...
Рейтинг: 0 / 0
Single page aplication
    #38934828
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К, и тексты следовало бы в ресурсы вынести, и урлы в config "в лучших традициях" :)
...
Рейтинг: 0 / 0
Single page aplication
    #38934840
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот кстати лучшие традиции Ajax calls относят к модели.
...
Рейтинг: 0 / 0
Single page aplication
    #38934862
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAАлексей К, и тексты следовало бы в ресурсы вынести, и урлы в config "в лучших традициях" :)Не хочу. :-)
skyANAА вот кстати лучшие традиции Ajax calls относят к модели.Как мне кажется, там описывается ViewModel - класс, к которому биндится View.

Но, как я и говорил выше, выделение классов произвожу по необходимости. На настоящий момент такой необходимости в данном проекте не вижу.
...
Рейтинг: 0 / 0
25 сообщений из 73, страница 2 из 3
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Single page aplication
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]