【问题标题】:Angular: Resetting Factory or ServiceAngular:重置工厂或服务
【发布时间】:2016-01-06 20:58:52
【问题描述】:

我有一个 Angular 工厂,它是一个复杂的对象,看起来像这样:

app.factory("mainFcty", function(){
    return {
        a:"",
        b:"",
        c:""
    }
});

当用户从应用程序继续该过程时,他们填写了上述表格。例如说他们正在预订。 他们完成了流程,将其添加到购物车并再次开始填写mainFcty 的流程。 问题是当他们将mainFcty 添加到购物车时,这是一个我需要将mainFcty 重置为abc 的原始状态的数组,它们都是空字符串。 出于某种原因,一旦我再次启动该过程,应用程序会将其重置为原始状态,但在该过程的某个地方,与旧 mainFcty 的绑定重新出现并覆盖了我第二次收集的所有数据。

在继续该过程之前,任何人对如何重置绑定并删除旧绑定的所有痕迹有任何可靠的想法?

非常感谢您的帮助!

【问题讨论】:

  • 你能在闭包中创建一个本地对象吗? app.factory("mainFcty", [function() { var default_values = { a:"", b:"", c:""}; var current_data = { resetData: function() { $.extend( current_data, default_values ); } }; current_data.resetData(); return current_data; }]);
  • 看起来它会起作用,但是我将在 mainFcty 中的哪个值也写入数据,我将如何做呢?目前我这样写给 mainFcty:- mainFcty.a = "HelloWorld";会不会是这样的:- mainFcty.currentData.a = "helloWorld";感谢您到目前为止的帮助:)

标签: javascript angularjs service factory


【解决方案1】:

创建一个默认值对象,并将值复制到可返回工厂对象,并使用一种方法用默认值覆盖当前值。

例如:https://jsfiddle.net/xmtkg5tz/1/

var app = angular.module('myApp',[])
.factory("mainFcty", [function() { 
    var current_data = {}; 
    var default_values = { 
        a:"", 
        b:"I am a default that is not-empty", 
        c:"",
        resetData: function() { 
            console.log( 'Resetting')
            return current_data = angular.extend( current_data, default_values ); 
       } 
    }; 
    default_values.resetData();
    return current_data;
}])
.controller('exampleCtrl',['$scope', 'mainFcty', function($scope,mainFcty) {
    $scope.fcty = mainFcty;
    $scope.submit = function() { 
        console.log( 'reset?', $scope.fcty.a, $scope.fcty.b, $scope.fcty.c ); 
        console.log( 'Before:', mainFcty );
        mainFcty.resetData(); 
        console.log( 'After:', mainFcty ); 
    };
}]);

【讨论】:

  • 啊,太棒了,现在就试试。
  • 这很好,除了一件小事,我有一个带有 mainFcty 的数组。这个叫allTxn,这个好像没有reset?默认值和当前数据都在更新有什么想法吗?
  • 你能提供一个jsfiddle作为例子吗?
  • 我排序了谢谢,我需要使用复制而不是扩展,因为它需要是深层复制!感谢您的所有帮助,您的英雄! :)
【解决方案2】:

我发现在工厂开始时声明变量、调用 reset、然后在我想重置变量时使用 reset 更容易。

  .factory('sharedDataUserFlowService', function () {
        var serviceVariables;
        resetData();
        return {
            resetData: resetData,
            triggerFormCheck: triggerFormCheck,

        };

        function resetData() {
             serviceVariables = {
                 triggerFormValidateCheck: false,
                 triggerBlockStageVariable: null,
                 isFormValid: false,
                 blockedStage: null,
                 isProcessEnd: false
             }
        }

        function triggerFormCheck() {
            serviceVariables.triggerFormValidateCheck = !serviceVariables.triggerFormValidateCheck;
        }

可以从任何注入sharedDataUserFlowService.resetData();的地方调用

祝你好运。

【讨论】:

    猜你喜欢
    • 2013-07-01
    • 2019-12-26
    • 2016-07-04
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    相关资源
    最近更新 更多