在获取数据之前,指令的代码会触发

时间:2015-11-19 16:08:06

标签: javascript html angularjs angularjs-directive

这是此问题Get other columns from select ng-options

的延续

我的指令存在问题。第一个问题是,对于表单的第一个初始加载,我可以正确地看到部门和类别,但项目显示“选择项目”而不是项目。第二个问题是当我导航到列表中的另一行时,未显示初始值(例如,所有内容都显示“选择部门”,“选择类别”,“选择项目”而不是值。我确认在那种情况下我还没有检索行的数据。所以,我需要在获取数据后才运行指令代码。

如何解决我的问题?

以下是该指令的完整代码:

(function () {
    'use strict';

    var app = angular.module('sysMgrApp');

    app.directive('smDci', ['departmentService', 'categoryService', 'itemService', smDci]);

    function smDci(departmentService, categoryService, itemService) {

        var directive = {
            restrict: 'E',
            scope: {
                selectedDepartmentId: '=?departmentid',
                selectedCategoryId: '=?categoryid',
                selectedItemId: '=itemid',
                selectedDci:  '=?dci'

            },
            controller: ['$scope', 'departmentService', 'categoryService', 'itemService',
                function ($scope, departmentService, categoryService, itemService) {
                $scope.selectedDepartmentId = $scope.selectedDepartmentId || 0;
                $scope.selectedCategoryId = $scope.selectedCategoryId || 0;
                $scope.selectedItemId = $scope.selectedItemId || 0;
                $scope.selectedDci = $scope.selectedDci || '';                
               
                var init = function () {
                    $scope.metaData = {};
                    window.console && console.log('Selected departmentId = ' + $scope.selectedDepartmentId +
                        ' Selected categoryId = ' + $scope.selectedCategoryId + ' Selected ItemId = ' + $scope.selectedItemId);
                    departmentService.getAllDepartments().then(function (data) {
                        $scope.metaData.departments = data.departments;
                        //window.console && console.log('Got all departments...')
                    });
                    if ($scope.selectedDepartmentId == 0 && $scope.selectedCategoryId == 0 && $scope.selectedItemId != 0) {
                        itemService.getItemById($scope.selectedItemId).then(function (data) {
                            var item = data.item;
                            if (item != null) {
                                $scope.selectedItem = item;
                                $scope.selectedDepartmentId = item.departmeId;
                                $scope.selectedCategoryId = item.categoryId;
                                
                                window.console && console.log('Initial selections are about to fire...')
                                getInitialSelections();
                            }

                        });
                    }
                    else {
                        getInitialSelections();
                    }
                };

                var getInitialSelections = function()
                {
                    if ($scope.selectedDepartmentId != 0) {
                        $scope.departmentChanged($scope.selectedDepartmentId);
                    }
                    if ($scope.selectedCategoryId != 0) {
                        $scope.categoryChanged($scope.selectedCategoryId);
                    }
                }

                $scope.departmentChanged = function (departmentId) {
                    if (!departmentId) {
                        $scope.selectedCategoryId = '';
                        $scope.selectedItemId = '';
                        $scop.selectedItem = {};
                        $scope.selectedDci = '';
                    }
                    else
                    {
                        categoryService.getCategoriesByDepartmentId(departmentId).then(function (data) {
                            $scope.metaData.categories = data.categories;
                            //window.console && console.dir($scope.selectedItem);
                        });
                    }
                };

                $scope.categoryChanged = function (categoryId) {
                    if (!categoryId) {
                        $scope.selectedItemId = '';
                        $scope.selectedItem = null;
                        $scope.selectedDci = '';
                    }
                    else
                    {
                        itemService.getItemsByCategoryId(categoryId).then(function (data) {
                            $scope.metaData.items = data.items;
                        });
                    }
                };

                $scope.itemChanged = function(item)
                {
                    $scope.selectedItemId = item.itemId;
                    $scope.selectedDci = item.department + item.category + item.item;
                }

                init();
            }],
            templateUrl: 'app/templates/smDci'
        };
        return directive;
    }
})();

及其HTML:

<div class="row">

    <label class="control-label col-md-2" title="@Labels.dci">@Labels.dci:</label>
   
    <div class="col-md-3">
        <select class="form-control" ng-model="selectedDepartmentId" name="department" id="department"
                ng-options="d.departmeId as d.descrip for d in metaData.departments"
                data-no:dirty-check
                ng-change="departmentChanged(selectedDepartmentId)">

            <option value="">@String.Format(Labels.selectX, Labels.department)</option>
        </select>
    </div>
    <div class="col-md-3">
        <select class="col-md-3 form-control" ng-model="selectedCategoryId" id="category" name="category"
                ng-disabled="!selectedDepartmentId"
                data-no:dirty-check
                ng-change="categoryChanged(selectedCategoryId)"
                ng-options="c.categoryId as c.descrip for c in metaData.categories | filter: {departmeId:selectedDepartmentId}">
            <option value="">@String.Format(Labels.selectX, Labels.category)</option>
        </select>
    </div>
    <div class="col-md-3">
        <select class="col-md-3 form-control" ng-model="selectedItem" id="item" name="item"
                ng-disabled="!selectedCategoryId"
                ng-change="itemChanged(selectedItem)"
                ng-options="c as c.descrip for c in metaData.items | filter: {departmeId:selectedDepartmentId, categoryId:selectedCategoryId}">
            <option value="">@String.Format(Labels.selectX, Labels.item)</option>
        </select>
        <div class="field-validation-error">
            <span ng-show="item.$error.required">@String.Format(Messages.isRequired, Labels.item)</span>
        </div>
    </div>
</div>
<div class="clearfix"></div>

这就是我在表单中使用它的方式:

<data-sm:dci itemid="currentCardAct.itemId"  dci="currentCardAct.dci"></data-sm:dci>

使用日志记录到控制台我可以看到在我需要后检索卡片数据,例如在控制台中我看到了

Selected departmentId = 0 Selected categoryId = 0 Selected ItemId = 0 CardActController.js:221当前卡活动数据已检索.. smDci.js:28 Selected departmentId = 0 Selected categoryId = 0 Selected ItemId = 0 CardActController.js:221检索当前卡活动数据..

我想我可以在指令的代码中添加监视,但这是唯一的选择吗?

1 个答案:

答案 0 :(得分:1)

我通过添加手表解决了这个问题。我现在正试图通过初始选择项目来解决问题,并且显然这是http://odetocode.com/blogs/scott/archive/2013/06/19/using-ngoptions-in-angularjs.aspx中关于初始选择的已知问题。