AngularJS:需要解决空数组的错误

雅库布

我有一个订阅功能,通过选中一个单选框打开。在本节中打开时,我有 2 个单选按钮,用于订阅每周或每月以及某个项目下方的时间段。当我按下保存时,必须为我从服务器获得的一个项目保存此期间的状态。您可以查看屏幕截图以查看视图无论如何,没有保存,因为数组结果为空并且该项目不在该数组中。我的问题是我看到了下面的项目,但不知何故我没有将它推入数组,并使用从单选按钮中选择的周期。我想得到帮助以了解为什么会这样以及我应该修改什么以使其正常工作。

请检查我正在共享控制器的代码并查看:

searchApp.controller('UserSettingsCtrl', ['$scope', '$q', '$rootScope', 'aiStorage', 'userConfig', 'UserSettingsService', 'WebsiteSource', 'AnalyticsEmailService', 'toaster', '$translate', '$filter', 'ngTableParams',
function($scope, $q, $rootScope, store, userConfig, UserSettingsService, WebsiteSource, AnalyticsEmailService, toaster, $translate, $filter, ngTableParams) {
    $scope.init = function() {
        $scope.availableLanguages = {
            da: 'Dansk',
            en: 'English',
            sv: 'Svensk'
        }
        window.scope = $scope
        $scope.userInfo = store.get('user')
        $scope.loadingAction = false
        $scope.selectFlag = false
        $scope.subscriptionEnginesFromServer = []
        $scope.subscriptionEngines = []
        $scope.analyticsEmailSettings = {}
        $scope.engines = angular.copy(WebsiteSource.sites)
        AnalyticsEmailService.getUserSubscription().then(
            function success(response) {
                $scope.loadingAction = false
                $scope.subscription = response
                console.log('response.data', response.data)
                $scope.subscriptionEnginesFromServer = populateSubscribedEnginesFromServer(response.data)
                getUnselectedEngines()
                $scope.analyticsEmailSettings.subscribed = (response.data.length > 0)
            },
            function error() {})
    }

    function populateSubscribedEnginesFromServer(data) {
        console.log('data', data)
        var subscriptionEngines = []
        for (var i = 0; i < data.length; i++) {
            var subscription = data[i]
            var engine = $scope.engines.filter(function(x) {
                if (x.id === subscription.engine) {
                    var index = $scope.engines.indexOf(x)
                    $scope.engines[index].type = subscription.type
                }

                return x.id === subscription.engine
            })[0]
            console.log('engine', engine)
            if (engine) subscription.name = engine.name

            subscriptionEngines.push(subscription)
        }
        console.log('subscriptionEngines', subscriptionEngines)
        if (subscriptionEngines.length == 0) {
            $scope.analyticsEmailSettings.subscription = 'WeeklyAnalytics'
        } else {
            $scope.analyticsEmailSettings.subscription = subscriptionEngines[0].type
        }
        return subscriptionEngines
    }

    // Save for all always the user have to press the save button if wants save no auto save as it is now
    $scope.save = function() {
            $scope.loadingAction = true
            if ($scope.analyticsEmailSettings.subscribed) {
                AnalyticsEmailService.updatesubscriptions($scope.subscriptionEnginesFromServer, function success(response) {}, function error() {})
            } else {
                $scope.analyticsEmailSettings.subscription = 'WeeklyAnalytics'
                $scope.subscriptionEnginesFromServer = []
                AnalyticsEmailService.updatesubscriptions($scope.subscriptionEnginesFromServer, function success(response) {}, function error() {})
            }
            UserSettingsService.save({
                userId: $scope.userInfo.id
            }, $scope.userInfo, function() {
                $scope.loadingAction = false
                userConfig.setCurrentUserConfig($scope.userInfo)
                userConfig.setUserLocale()
                store.set('user', $scope.userInfo)
                toaster.pop({
                    type: 'success',
                    body: $translate.instant('notifications_user_settings_changed_success')
                })
            }, function() {})
            $scope.subscriptionEngines = []
        }
        // removeSelectedEngines
    getUnselectedEngines = function() {
        for (var i = 0; i < $scope.engines.length; i++) {
            if ($scope.subscriptionEnginesFromServer.filter(function(x) {
                    return x.engine === $scope.engines[i].id
                }).length == 0)
                $scope.engines[i].type = ''
        }
    }

    // @todo: consider referring by array key instead of engineId
    function updatesubscriptions(engineId, subscriptionType) {
        var engine
        for (var i = 0; i < $scope.subscriptionEnginesFromServer.length; i++) {
            if ($scope.subscriptionEnginesFromServer[i].engine == engineId) {
                engine = $scope.subscriptionEnginesFromServer[i]
            }
        }

        engine.type = subscriptionType
        engine.engine = engineId
    }

    $scope.updateSubscriptionType = function(engine) {
        for (var i = 0; i < $scope.subscriptionEnginesFromServer.length; i++) {
            updatesubscriptions($scope.subscriptionEnginesFromServer[i].engine, $scope.analyticsEmailSettings.subscription)
        }
    }

    $scope.addSubscribedEngine = function(engine) {
        $scope.subscriptionEngines = []
        engine.type = $scope.analyticsEmailSettings.subscription

        $scope.subscriptionEnginesFromServer.push({
            type: engine.type,
            engine: engine.id,
            name: engine.name
        })
    }

    $scope.selectFirstUnsubscribedEngine = function() {
        var filtered
        filtered = $scope.engines.filter(function(x) {
            return x.type == ''
        })

        filtered = $filter('orderBy')(filtered, 'name')

        $scope.engine.current = filtered.length ? filtered[0] : null
    }

    $scope.removeSubscribedEngine = function(engine) {
        engine.type = ''
        for (var i = 0; i < $scope.subscriptionEnginesFromServer.length; i++) {
            if ($scope.subscriptionEnginesFromServer[i].engine == engine.id) {
                $scope.subscriptionEnginesFromServer.splice(i, 1)
            }
        }
        save()
    }
}])

看法:

<div ng-controller="UserSettingsCtrl" ng-init="init()">

<div class="content">

    <header class="flex-container row header">
        <div class="flex-1">
            <h1 class="flex-1">{{ 'user_settings_title' | translate }}</h1>
        </div>
        <!--<a class="logout" href ui-sref="account.settings.changepassword">{{ 'user_change_password_menu' | translate }}</a>-->
    </header>

    <div class="main-edit">
        <div class="subsection">
            <div class="inputs-container-row full-width">
                <div class="input-group full-width">
                    <div class="inputfield">
                        <label class="label ng-binding" for="name">
                            {{ 'user_settings_firstname_label' | translate }}
                        </label>
                        <input type="text" name="firstname" ng-model="userInfo.firstName" class="flex-1" ng-class="{'first-letter-to-upper' : userInfo.firstName.length > 0 }" placeholder="{{ 'user_settings_firstname_placeholder' | translate }}">
                    </div>
                </div>
                <div class="input-group full-width">
                    <div class="inputfield">
                        <label class="label ng-binding" for="name">
                            {{ 'user_settings_lastname_label' | translate }}
                        </label>
                        <input type="text" name="lastname" ng-model="userInfo.lastName" class="flex-1" ng-class="{'first-letter-to-upper' : userInfo.lastName.length > 0 }" placeholder="{{ 'user_settings_lastname_placeholder' | translate }}">
                    </div>
                </div>
            </div>
            <div class="inputs-container-row full-width">
                <div class="inputs-container-row half-width">
                    <div class="input-group full-width">
                        <label class="label" for="name">{{ 'user_settings_language_label' | translate }}</label>
                        <div class="select-group full-width">
                            <select class="select" id="selectLanguage" ng-model="userInfo.language" ng-options="key as value for (key , value) in availableLanguages"></select>
                            <label for="selectLanguage"><span class="fa fa-angle-down"></span></label>
                        </div>
                    </div>
                </div>
                <div class="inputs-container-row half-width">
                    <div class="input-group full-width">
                        <label class="label" for="name">
                            {{ 'user_settings_phone_label' | translate }}
                        </label>
                        <input type="text" name="lastname" ng-model="userInfo.phoneNumber" placeholder="{{ 'user_settings_phone_placeholder' | translate }}">
                    </div>
                </div>
            </div>
        </div>
        <div class="subsection">
            <div class="inputs-container-row half-width">
                <div class="input-group full-width">
                    <label class="label" for="name">
                        {{ 'user_settings_password_label' | translate }}
                        <a ui-sref="account.settings.changepassword" class="button button-link--primary button--first">
                            {{ 'user_settings_password_button' | translate }}...
                        </a> 
                    </label>
                </div>
            </div>
        </div>
    </div>
    <div class="flex-container row header">
        <div class="flex-1">
            <h1 class="flex-1">{{ 'user_settings_emailStatistics_title' | translate }}</h1>
        </div>
    </div>
    <!--|||  Subscribe Start  |||-->
    <div class="main-edit">
        <div class="subsection">
            <div class="flex-container row">
                <div class="radiobutton-group">
                    <div class="width-140">
                        <input id="subscribed" type="checkbox" ng-model="analyticsEmailSettings.subscribed" value="subscribed" class="radiobutton">
                        <label class="label highlight inline no-bottom-margin" for="subscribed">
                            {{ 'user_settings_emailStatistics_subscribe' | translate }}
                        </label>
                    </div>
                </div>
            </div>
            <div ng-show="analyticsEmailSettings.subscribed">
                <div class="flex-container row">
                    <div class="input-group flex-1" ng-switch="analyticsEmailSettings.subscription">
                        <label class="label" for="name">{{ 'user_settings_emailStatistics_recurrence' | translate }}</label>
                        <div class="inputs-container-row half-width" name="oftenReportSent">
                            <span class="radiobutton flex-1" ng-class="{'checked' : analyticsEmailSettings.subscription === 'WeeklyAnalytics'}" name="radio">
                                <input type="radio" name="WeeklyAnalytics" ng-model="analyticsEmailSettings.subscription" ng-change="updateSubscriptionType()" ng-checked="analyticsEmailSettings.subscription === 'WeeklyAnalytics'" value="WeeklyAnalytics" id="WeeklyAnalytics" ng-required="">
                                <label for="WeeklyAnalytics">{{ 'user_settings_emailStatistics_weekly' | translate }}</label>
                            </span>
                            <span class="radiobutton flex-1" ng-class="{'checked' : analyticsEmailSettings.subscription === 'MonthlyAnalytics'}">
                                <input type="radio" name="MonthlyAnalytics" ng-model="analyticsEmailSettings.subscription" ng-change="updateSubscriptionType()" ng-checked="analyticsEmailSettings.subscription === 'MonthlyAnalytics'" value="MonthlyAnalytics" id="MonthlyAnalytics" ng-required="">
                                <label for="MonthlyAnalytics">{{ 'user_settings_emailStatistics_monthly' | translate }}</label>
                            </span>
                        </div>
                        <div> <span style="color:red;" ng-show="analyticsEmailSettings.subscription == null">Please select option</span></div>
                    </div>
                </div>
                <h1>Before</h1>
                <div ng-if="engines.length == 1">
                    <ul class="tags tags--inline item-with-inline-buttons">
                        <li ng-repeat="engine in engines | orderBy:'name'">
                            {{engine.name}}
                            <span class="button-icon button--primary button--delete" ng-click="removeSubscribedEngine(engine); selectFirstUnsubscribedEngine()">
                                <i class="fa fa-trash-o"></i>
                            </span>
                        </li>
                    </ul>
                </div>
                <h1>after</h1>
                <div ng-show="engines.length > 1">
                    <div class="flex-container row" ng-show="((engines | filter:{type:''}:true).length != 0)">
                        <div class="input-group full-width">
                            <label class="label" for="selectEngine">
                            {{ 'user_settings_emailStatistics_engines_label' | translate }}:
                        </label>
                            <div class="half-width inputfield--horizontal" style="margin-bottom: 10px;">
                                <div class="full-width select-group" ng-if="(engines | filter:{type:''}:true).length > 0">

                                    <select class="select" id="selectEngine" ng-model="$parent.engine.current" ng-options="website.name for website in engines | filter:{type:''}:true | orderBy:'name'" ng-init="$parent.engine.current = (engines | filter:{type:''}:true | orderBy:'name')[0]">
                                </select>
                                    <label for="selectSubscription"><span class="fa fa-angle-down"></span></label>
                                </div>
                                <span ng-show="engines.length == 1">{{(engines | filter:{type:''}:true)[0].name}}</span>
                                <div id="btnAddWebSitesSubscription" ng-show="engines.length > 0" class="button button--add" ng-click="addSubscribedEngine(engine.current); selectFirstUnsubscribedEngine()"><i class="fa fa-plus"></i></div>
                            </div>
                        </div>
                    </div>
                    <div ng-model="successMessage" ng-show="showMessage" style="color:green;" class="message fadein fadeout">{{successMessage}}</div>
                </div>
                <h1 ng-show="subscriptionEnginesFromServer.length > 0 && engines.length > 1">Websites Subscribed</h1>
                <div class="flex-container row" ng-if="subscriptionEnginesFromServer.length > 0 && engines.length > 1">
                    <ul class="tags tags--inline item-with-inline-buttons">
                        <li ng-repeat="engine in engines | filter:{type:'Analytics'} | orderBy:'name'">
                            {{engine.name}}
                            <span class="button-icon button--primary button--delete" ng-click="removeSubscribedEngine(engine); selectFirstUnsubscribedEngine()">
                                <i class="fa fa-trash-o"></i>
                            </span>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
        <footer class="flex-container flex-end row footer">
            <button class="button button--primary button--action" ng-click="save();">
                    <i ng-show="loadingAction" class="fa fa-spinner fa-spinner-custom"></i>
                    <span ng-show="!loadingAction">{{ 'general_save' | translate }}</span>
            </button>
        </footer>
    </div>
</div>

资源

使用 ng-hide/ng-show 时要小心,因为当部分被“隐藏”时,它会破坏自身包含的模型(如果有的话)(因此,请改用 ng-if)。

在订阅部分的 html 中,您可以这样调用:

ng-change="updateSubscriptionType()"

但是在你的javascript中你有:

$scope.updateSubscriptionType = function(engine) {
  for (var i = 0; i < $scope.subscriptionEnginesFromServer.length; i++) {
    updatesubscriptions($scope.subscriptionEnginesFromServer[i].engine, $scope.analyticsEmailSettings.subscription)
  }
}

所以它期待一个你永远不会传入的“引擎”参数。但是查看代码你无论如何都不使用引擎参数;您使用 $scope.subscriptionEnginesFromServer[i] 的“引擎”属性,仅此而已。

然而,无论如何,它并没有做任何我能看到的事情。它遍历一个空数组,然后调用 updatesubscriptions() 来做某事,但它实际上不会调用它。

此外, updatesubscriptions() 方法本身实际上并没有做任何事情。这可能就是为什么你没有在你的数组中得到任何东西的原因。我建议稍微修改您的模板,因为订阅单选按钮在引擎循环之外,所以您将无法将订阅类型与任何引擎相关联。完成后,订阅类型单选按钮将可以访问“引擎”,您可以将其传入。相应地修改您的方法:

$scope.updateSubscriptionType = function(engine) {
  if (!$scope.subscriptionEnginesFromService.includes(engine)) {
    $scope.subscriptionEnginesFromService.push(engine); 
  }
  updatesubscriptions(engine, $scope.analyticsEmailSettings.subscription);
}

并稍微修改 updatesubscriptions()。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

需要解决 SQL 查询错误

来自分类Dev

需要帮助来解决我的错误通知:将数组转换为字符串

来自分类Dev

需要帮助解决错误C2664

来自分类Dev

需要协助解决“ HTML”错误吗?

来自分类Dev

需要帮助解决我的天气命令错误

来自分类Dev

内存不足错误需要解决

来自分类Dev

如何用$ unwind解决空数组?

来自分类Dev

解决向空数组追加的问题

来自分类Dev

AngularJS中的空值错误

来自分类Dev

仍然得到错误空数组

来自分类Dev

什么是空括号的需要“{}”在结构的数组的结束?

来自分类Dev

AngularJS重复数组错误

来自分类Dev

AngularJS $ http POST请求为空数组

来自分类Dev

获取请求后为空数组(AngularJS)

来自分类Dev

angularjs中工厂方法的空数组

来自分类Dev

$ resource响应AngularJS中的空数组

来自分类Dev

angularjs中工厂方法的空数组

来自分类Dev

需要帮助解决我的使用对象代码创建多维数组

来自分类Dev

需要数组,但List <Double>发现错误

来自分类Dev

错误:需要数组,但找到字符串

来自分类Dev

如何解决错误:是否需要https://请求的OpenSSL支持?

来自分类Dev

需要使用SVG属性filterUnits解决IE错误的方法

来自分类Dev

Django Fixtures主键错误,需要自然键解决方案

来自分类Dev

需要帮助来解决语法错误消息

来自分类Dev

需要使用SVG属性filterUnits解决IE错误的方法

来自分类Dev

需要帮助解决redirect_uri_mismatch错误

来自分类Dev

需要协助解决Rails“捆绑执行佣金测试”错误

来自分类Dev

*需要帮助解决我的程序* Visual Studio调试错误

来自分类Dev

我需要提示如何解决此错误