对角度范围感到困惑。为什么这不能按预期运作?

时间:2014-03-01 03:02:07

标签: angularjs angularjs-directive angularjs-scope

这非常令人困惑..这是一个小提琴手JSFiddler Example

Angular.copy适用于此示例但使用热毛巾datacontext.lookup.setLookups(true)方法导致(RangeError:超出最大调用堆栈大小)。知道为什么吗?

从列表中选择U3,然后单击“添加”。 U3从选择列表(下拉列表)中删除并添加到选定列表中。 U3已从其他下拉列表中删除。

所以它在全球范围内共享我的“单位”列表,以及我的真实项目中的一些内容。

如何将列表复制到特定控制器实例的包含范围内?

我正在使用带有breeze.js的HotTowel.Angular模板。我想知道是否正在共享对缓存查找值的引用。以下是实际获取单位列表数据的方法。

 <!-- the actual item detail controller -->
  (function () {
  'use strict';

  var controllerId = 'itemdetail';

   angular.module('app').controller(controllerId,
    ['common', 'datacontext', itemdetail]);

  function itemdetail(common, datacontext) {
    var vm = this;
    var getLogFn = common.logger.getLogFn;
    var log = getLogFn(controllerId);


    vm.units = [];
    vm.selectedUnit = undefined;
    vm.selectedUnits = [];


    activate();

    function activate() {
        common.activateController([initLookupValues()], controllerId)
            .then(function () {
               // log('Activated Controller' + controllerId,controllerId,true);
            });
    }


    function initLookupValues() {
        vm.units = datacontext.lookup.refreshUnitLookupCachedData(true);
    }
  }
})();       
 <!-- FROM repository.lookup.js ---->
    function refreshUnitLookupCachedData(includeNullo) {
        var predicate = breeze.Predicate.create('isLookUpValue', '==', true);

        if (includeNullo) {
            predicate = predicate.or(this._predicates.isNullo);
        }

        return this.lookupCachedData.units = this._getAllLocal(entityNames.unit, 'displayOrder', predicate);
    }

<!-- FROM repository.abstract.js -->

    function _getAllLocal(resource, ordering, predicate) {
        return EntityQuery.from(resource)
            .orderBy(ordering)
            .where(predicate)
            .using(this.manager)
            .executeLocally();
    }

我有一个指令将对象列表绑定到选择下拉框。然后,当用户进行选择时,他们单击添加按钮,该项目将从选择列表中删除并添加到“选定”列表中。用户可以从选定列表中删除它,并将其放回选择列表中。

使用ng-repeat为每个需要这些值的对象呈现此select指令。 ng-repeat中的每个项目都有自己的另一个控制器实例。

因此,如果ng-repeat有10个对象呈现,则其中10个下拉列表将与其他输入控件一起呈现。

如果我在第一个下拉列表中选择一个项目并将其添加到所选列表中。页面上的每个下拉列表都会更改(项目从下拉列表中删除并添加到选择列表中)。即使每个呈现的下拉列表都应该与该ng-repeat项目的特定控制器相关。

我做的范围有问题,但没有想法。

 <section id="admin-view" class="mainbar" data-ng-controller="myItemController as i">
        <section class="matter">
            <div class="container">
                <div class="row">
                    <div id="itemFilter" >
                        <div data-dc-item-filter
                             items="i.itemPartials"
                             selected-item="i.selectedItem"
                             item-filter-text="i.itemSearch"
                             filtered-items="i.filteredItemPartials"
                             use-drop-down="false">
                        </div>
                    </div>
                </div>
                <div class="row"                      
                   ng-repeat="itemPartial in i.filteredItemPartials"
                        data-ng-controller="itemdetail as vm" >
                        <div class="widget>
                            <div data-cc-widget-header title="{{itemPartial.name}}" 
                                       allow-collapse="true" 
                                    is-widget-expanded="vm.isWidgetExpanded"></div>
                            <div class="widget-content collapse">
                                <div class="row" data-ng-click="$event.stopPropagation();">
                                    <div id="solids" class="col-sm-8 col-md-7 col-lg-4">
                                        <div class="widget">
                                            <div data-cc-widget-header 
                                             title="Solid Options"   nested-header="true"
                                                 allow-collapse="true"
                                                 is-widget-expanded="vm.isWidgetExpanded"></div>
                                            <div class="row widget-content">
                                                <div class="col-sm-4 col-md-4 col-lg-4">
                                                    <div data-dc-lookup-dropdown
                                                         title="Items:"
                                                         items="vm.myList"
                                                         selected-item="vm.selectedItem"
                                                         selected-items="vm.selectedItems">
                                                    </div>
                                                </div>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </section>
        </section>

这是我的指令模板html和控制器

  <select class="form-control"
                        data-ng-options="(item.acronym !== undefined ? item.acronym : item.name) for item in items | filter:{selected: false}"
                        data-ng-model="selectedItem"
                        data-ng-disabled="disableSelect"
                        data-ng-change="onChange(item)"
                        ng-init="selectedItem = items[0]"></select>
                <span class="input-group-btn">
                    <button class=" btn btn-info blue-tooltip"
                            data-ng-disabled="disableAddButton"
                            data-ng-click="addSelectedItem()">
                        <span class=" fa fa-plus"></span>
                    </button>
                </span>  


  app.directive('dcLookupDropdown', [function () {
       //Usage:
       //<div data-dc-lookup-dropdown
       //     title="Units:"
       //     items="vm.mylist"
       //     selected-item="vm.selectedItem"
       //     selected-items="vm.selectedItems">
       //</div>
        var directive = {
            controller: ['$scope', lookupDropDownController]
            ,scope:  {
                "title":"@"
                ,"items": "="
                ,"selectedItem": "="
                ,"selectedItems": "="
            }
            ,restrict: 'A'
            ,replace: true
            ,templateUrl: 'app/templates/dc-lookupDropDown-template.html'
        };

        return directive;


        function lookupDropDownController($scope) {

            $scope.addSelectedItem = addSelectedItem;
            $scope.removeSelectedItem = removeSelectedItem;
            $scope.onChange = onChange;
            $scope.disableAddButton = true;
            $scope.disableSelect = false;

            activate();

            function activate() { }

            function addSelectedItem() {
                $scope.selectedItems.push($scope.selectedItem);

                _disableOption($scope.items, $scope.selectedItem);

                //sets dropdown back to nullo object
                $scope.selectedItem = $scope.items[0];
                $scope.disableAddButton = shouldDisableAddButton();
                $scope.disableSelect = shouldDisableSelect();
            }

            function onChange(item) {
                $scope.disableAddButton = shouldDisableAddButton();
            }

            function shouldDisableAddButton() {
                return ($scope.selectedItem.id == 0);
            }

            function shouldDisableSelect() {
                return ($scope.selectedItems.length == $scope.items.length - 1);
            }

            function removeSelectedItem(item) {
                $scope.selectedItem = item;

                for (var idx = $scope.selectedItems.length; idx--;) {
                    if ($scope.selectedItems[idx].id == item.id) {
                         $scope.selectedItems.splice(idx, 1);
                    }
                }
                _enableOption($scope.items, $scope.selectedItem);

                //sets dropdown back to nullo object
                $scope.selectedItem = $scope.items[0];
                $scope.disableAddButton = shouldDisableAddButton();
                $scope.disableSelect = shouldDisableSelect();
            }

            function _disableOption(itemList, selectedItem) {
                if (selectedItem !== null) {
                    angular.forEach(itemList, function (item) {
                        if (item.id == selectedItem.id) {
                            item.selected = true;
                            return item;
                        }
                        return selectedItem;
                    }, selectedItem);
                };
            };

            function _enableOption(itemList, selectedItem) {
                if (selectedItem !== null) {
                    var foundItem = angular.forEach(itemList, function (item) {
                        if (item.id == selectedItem.id) {
                            item.selected = false;
                            return item;
                        }
                        return selectedItem;
                    }, selectedItem);
                };
            };
        }
    }]);

0 个答案:

没有答案