Javascript AngularJS:需要解决空数组的bug

Javascript AngularJS:需要解决空数组的bug,javascript,angularjs,arrays,Javascript,Angularjs,Arrays,我有一个订阅功能,它是通过选中一个广播框打开的。当在本节中打开时,我有两个单选按钮,用于订阅周期每周或每月以及项目下方。当我按下save键时,必须为我从服务器获得的一个项目保存此期间的状态。您可以查看屏幕截图以查看。无论如何,由于数组结果为空且该项不在该数组中,因此没有保存。我的问题是我看到了下面的项目,但不知怎么的,我没有用单选按钮中选择的周期将其推入数组。我希望得到帮助,以了解为什么会这样,我应该修改什么,使其正常工作 请检查我正在共享的代码控制器和视图: searchApp.control

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

请检查我正在共享的代码控制器和视图:

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()
    }
}])
searchApp.controller('UserSettingsCtrl'、['$scope'、'$q'、'$rootScope'、'aiStorage'、'userConfig'、'UserSettingsService'、'WebsiteSource'、'AnalyticsMailService'、'toaster'、'$translate'、'$filter'、'ngTableParams',
函数($scope、$q、$rootScope、store、userConfig、usersetings服务、WebsiteSource、AnalyticsEmailService、toaster、$translate、$filter、ngTableParams){
$scope.init=函数(){
$scope.availableLanguages={
da:‘丹斯克’,
嗯:"英语",,
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()。然后(
功能成功(响应){
$scope.loadingAction=false
$scope.subscription=响应
console.log('response.data',response.data)
$scope.subscriptionEnginesFromServer=填充SubscriptedEnginesFromServer(response.data)
getUnselectedEngines()
$scope.analyticsEmailSettings.subscribed=(response.data.length>0)
},
函数错误(){})
}
函数从服务器(数据)填充SubscribedEngines{
console.log('data',data)
变量subscriptionEngines=[]
对于(变量i=0;i<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-change="updateSubscriptionType()"
$scope.updateSubscriptionType = function(engine) {
  for (var i = 0; i < $scope.subscriptionEnginesFromServer.length; i++) {
    updatesubscriptions($scope.subscriptionEnginesFromServer[i].engine, $scope.analyticsEmailSettings.subscription)
  }
}
$scope.updateSubscriptionType = function(engine) {
  if (!$scope.subscriptionEnginesFromService.includes(engine)) {
    $scope.subscriptionEnginesFromService.push(engine); 
  }
  updatesubscriptions(engine, $scope.analyticsEmailSettings.subscription);
}