angular, как остановить отслеживание объектов сервиса

#javascript #angularjs #angular-services

#javascript #angularjs #angular-сервисы

Вопрос:

У меня есть служба, в которой я храню все свои классы DTO, которые я сопоставляю с вызовами api. Когда я использую эти объекты сервиса, они отслеживают весь путь обратно в службу, поэтому я не могу обновить их, если захочу совершить другую транзакцию.

вот сервис

 (function () {
    "use strict";

    var app = angular.module("app.bms");

    app.service("dtoObjects", function () {

        var state = {
            Id: "",
            Value: ""
        }

        var companyDto = {
            Id: "",
            Name: "",
            Address: "",
            Address2: "",
            City: "",
            State: state,
            Zip: "",
            Phone: "",
            contactName: ""
        }

        var departmentDto = {
            DepartmentID: "",
            DepartmentName: "",
            CompanyDto: companyDto,
            IsActive: false,
            States: [state]
        }

        var userDto = {
            UserId: "",
            FistName: "",
            LastName: "",
            Email: "",
            Phone: "",
            LoginName: "",
            Password: "",
            IsActive: "",
            Client: companyDto,
            Department: departmentDto
        }

        return {
            departmentDto: departmentDto,
            companyDto: companyDto,
            userDto: userDto
        }

    });
})();
 

Вот как я это внедряю.

 function userInfoController($scope, userService, dtoObjects, ngTableParams, popUpService, modalService)
 

Вот как я это использую

 var userDto = dtoObjects.userDto;
            popUpService.raisePopUp(addEditTplt, addEditCtrl, userDto, reloadTable);

            console.log(dtoObjects.userDto)
 

;

все, что я назначил этому объекту, теперь сопоставляется с ним обратно в service. Возможно ли, чтобы angular остановил это глубокое наблюдение за сервисом?

Спасибо!

Комментарии:

1. Возможно ли, чтобы DTO возвращал функцию конструктора и new ее всякий раз, когда вам нужна новая транзакция?

Ответ №1:

Вы можете обернуть службу DTO в функцию и использовать new для создания новой копии каждый раз, когда вам нужно выполнить сброс. Итак, ваш сервис будет выглядеть так:

 (function() {
"use strict";
var app = angular.module("app.bms");
app.service("dtoObjects", function() {
    function dto() {
        return {
            companyDto: companyDto
            //...
        }
        var companyDto = {
            //...
        }
    }
    return dto;
});})();
 

И тогда вы бы использовали его следующим образом:

 var newDTO = new dtoObjects();
console.log(newDTO.companyDTO);
 

Ответ №2:

В общем, часть возможностей Angular заключается в том, что сервисы являются одиночными, и поэтому одна ссылка может быть привязана везде в вашем приложении. Использование DTO в Angular, как правило, добавляет большое количество ненужных сложностей, поскольку Angular не должен беспокоиться о состояниях транзакций на сервере.

Однако, если вам абсолютно необходима эта функция, вы можете использовать angular.copy() для создания копии вашего DTO для использования в вашем представлении.

 //example with 1 argument
var userDto = angular.copy(dtoObjects.userDto);

//example update, using two arguments
angular.copy(userDto, dtoObjects.userDto);
 

Комментарии:

1. Спасибо, я совсем забыл о copy. Единственная причина, по которой я начинаю это делать, заключается в том, что у нас довольно сложная модель, и я думаю, что их синхронизация таким образом позволит избежать путаницы.