javascript - $scope 缺少选择绑定(bind)的成员

标签 javascript angularjs angular-ui

$scope 似乎缺少文本框预输入和选择列表的绑定(bind)属性。 这是一个显示我想要的行为的 fiddle :http://jsfiddle.net/langtonr/h4MKa/1/ 您可以根据需要添加和删除销售人员。 $scope 正确绑定(bind)到 $scope.salesmanEntry (在输入中选择的销售员)和 $scope.selectedSalesmen (已在列表框中选择的销售员)。

我已将相同的代码复制并粘贴到我的项目中,但它不起作用。我正在使用所有相同的库引用。看来范围不适用于这两个变量。 $scope.salesmanEntry 和 $scope.selectedSalesmen 始终未定义。我的完整 Controller 代码如下。什么可能会干扰我的 $scope?

我在我的 View 中输出以下内容:

<div>{{salesmanEntry.id}} {{salesmanEntry.displayName}}</div>

我的 View 始终正确显示这些内容,因此当我输入推销员时,它会显示出来,但当我进入 Controller 代码时, $scope.salesmanEntry 始终未定义。它与 $scope.selectedSalesmen 表现出相同的行为。我可以通过在 selectedSalesmen 上使用 ng-repeat 来输出到屏幕,但在我的 Controller 中 $scope.selectedSalesmen 始终未定义。

manageProductsModule.controller('productDetailCtrl', [
    'productSvc', 'equipmentOptionSvc', 'salesmanSvc', '$scope', function (productSvc, equipmentOptionSvc, salesmanSvc, $scope) {
        $scope.loadingProduct = false;
        $scope.product = {
            secureUsers: [],
            options: [],
            priceHistory: []
        };
        $scope.addedSalesmen = [];
        $scope.allSalesmen = [
    { id: 1, displayName: "Smith, John" },
    { id: 2, displayName: "Ramsey, Gordon" },
    { id: 3, displayName: "White, Betty" }];

        $scope.addSalesman = function (salesman) {
            if (!salesman.id) return;
            var result = $.grep($scope.addedSalesmen, function (e) { return e.id == salesman.id; });
            if (result.length === 0) {
                $scope.addedSalesmen.push(salesman);
            }
            $scope.salesmanEntry = { id: -1, displayName: "" };
        };

        $scope.removeSalesmen = function () {
            $scope.selectedSalesmen.forEach(function (salesman) {
                var index = $scope.addedSalesmen.indexOf(salesman);
                $scope.addedSalesmen.splice(index, 1);
            });
            $scope.selectedSalesmen = [];
        }
    }
]);

模板:

<div ng-app="manageProductsModule">
    <div class="container" ng-controller="productDetailCtrl">
        <h3>Model Details</h3>
        <form class="form-horizontal" role="form" ng-if="!loadingProduct">
            <div class="form-group">
                <label for="addSalesmenInput" class="control-label col-md-2">Add</label>
                <div class="col-md-4">
                    <div class="input-group">
                        <input name="addSalesmenInput" 
                               class="form-control" 
                               ng-model="salesmanEntry" 
                               typeahead="salesman as salesman.displayName for salesman in allSalesmen | filter:$viewValue" />
                        <div class="input-group-btn">
                            <button class="btn" ng-click="addSalesman(salesmanEntry)" ng-disabled="!salesmanEntry">
                                <i class="glyphicon glyphicon-plus"></i>
                            </button>
                        </div>
                    </div>
                </div>
            </div>
            <div class="form-group">
                <label for="salesmenInput" class="control-label col-md-2">Salesmen With Access</label>
                <div class="col-md-4">
                    <select name="salesmenInput" multiple="multiple" size="8" class="form-control" ng-model="selectedSalesmen" ng-options="salesman as salesman.displayName for salesman in addedSalesmen"></select>
                    <button class="btn" ng-click="removeSalesmen()" ng-disabled="!selectedSalesmen || selectedSalesmen.length === 0">
                        <i class="glyphicon glyphicon-minus"></i>
                    </button>
                </div>
            </div>
        </form>
    </div>
</div>

最佳答案

所以这就是我必须做的事情才能让它发挥作用。我绝对对这个看起来非常老套的解决方案不满意,并且想知道为什么这是必要的。我必须转到 $scope.$$childHead 来访问 salesmanEntry 和 selectedSalesmen,因为它们显然存储在错误的范围中。

    $scope.addSalesman = function (salesman) {
        if (!salesman.id) return;
        var result = $.grep($scope.addedSalesmen, function (e) { return e.id == salesman.id; });
        if (result.length === 0) {
            $scope.addedSalesmen.push(salesman);
        }
        $scope.$$childHead.salesmanEntry = { id: -1, displayName: "" };
    };

    $scope.removeSalesmen = function () {
        $scope.$$childHead.selectedSalesmen.forEach(function (salesman) {
            var index = $scope.addedSalesmen.indexOf(salesman);
            $scope.addedSalesmen.splice(index, 1);
        });
        $scope.$$childHead.selectedSalesmen = [];
    }

关于javascript - $scope 缺少选择绑定(bind)的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24041627/

相关文章:

javascript - 无法访问 Angular ui 模式对话框的模型值

javascript - 缺少形式参数 javascript

angularjs - 找不到脚本源

AngularJS - 在前端/浏览器中突出显示现有 pdf 文件的文本

javascript - 无法显示 Angular 形式的跨度

javascript - 在 Angular UI Bootstrap 日期选择器中附加工作日标签的点击事件

javascript - 如何在 AngularJS 指令中对 Controller 进行单元测试?

javascript - 无法让 CSS list-group-horizo​​ntal 填充容器并居中

JavaScript 原型(prototype)浏览器输出

AngularJS 和 UI 可排序 - 没有方法 'sortable' 错误