繁体   English   中英

保存和取消按钮不起作用

[英]save and cancel button is not working

我已经在angular js中创建了一个用于添加和删除弹出式模型的应用程序,弹出式模型即将发布,但是在保存时我变得不确定,并且取消无法正常工作。

JSFIDDLE

谁能告诉我一些解决方案

var app = angular.module('mainApp', ['commonApp', 'ui.bootstrap']);

app.controller('mainController', function ($scope, $rootScope, $modal, $log) {
    $scope.users = [{
        userId: 1,
        userName: "Jhonny"
    }, {
        userId: 2,
        userName: "Sunny"
    }];

    $scope.selectedUsers = {
        users: []
    };

    $scope.open = function (users, dept) {
        var modalInstance = $modal.open({
            templateUrl: 'myModalContent.html',
            controller: 'mainController',
            resolve: {
                usersInModalScope: function () {
                    return users;
                },
                deptInModalScope: function () {
                    return dept;
                }
            }
        });
    };

});


var commonApp = angular.module('commonApp', ['ui.bootstrap']);

commonApp.controller('ModalInstanceCtrl', function ($scope, $rootScope) {
    $scope.cancel = function () {
        $scope.modalInstance.close();
        if ($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest') {
            $rootScope.$apply();
        }
    }

    $scope.save = function () {
        alert(JSON.stringify($scope.selectedUsers));
    }
});


commonApp.directive('multiSelect', function ($q) {
    return {
        restrict: 'E',
        controller: "ModalInstanceCtrl",
        require: 'ngModel',
        scope: {
            selectedLabel: "@",
            availableLabel: "@",
            displayAttr: "@",
            available: "=",
            model: "=ngModel",
            eventHandler: '&ngClick'
        },
        template: '<div class="multiSelect">' +
            '<div class="select">' +
            '<label class="control-label" for="multiSelectAvailable">{{ availableLabel }} ' +
            '({{ available.length }})</label>' +
            '<select id="multiSelectAvailable" ng-model="selected.available" multiple ' +
            'ng-options="e as e[displayAttr] for e in available"></select>' +
            '</div>' +
            '<div class="select buttons">' +
            '<button class="btn mover right" ng-click="add()" title="Add selected" ' +
            'ng-disabled="selected.available.length == 0">' +
            '<i class=" icon-arrow-right"></i>' +
            '</button>' +
            '<button class="btn mover left" ng-click="remove()" title="Remove selected" ' +
            'ng-disabled="selected.current.length == 0">' +
            '<i class="icon-arrow-left"></i>' +
            '</button>' +
            '</div>' +
            '<div class="select">' +
            '<label class="control-label" for="multiSelectSelected">{{ selectedLabel }} ' +
            '({{ model.length }})</label>' +
            '<select id="currentRoles" ng-model="selected.current" multiple ' +
            'class="pull-left" ng-options="e as e[displayAttr] for e in model">' +
            '</select>' +
            '</div>' +
            '</div>' +
            '<div class="wrapper text-center">' +
            '<button class="btn btn-default" ng-click="save()"> Save </button>' +
            '<button class="btn btn-default" ng-click="cancel()">Cancel</button>' +
            '</div>',
        link: function (scope, elm, attrs) {
            scope.selected = {
                available: [],
                current: []
            };

            var dataLoading = function (scopeAttr) {
                var loading = $q.defer();
                if (scope[scopeAttr]) {
                    loading.resolve(scope[scopeAttr]);
                } else {
                    scope.$watch(scopeAttr, function (newValue, oldValue) {
                        if (newValue !== undefined) loading.resolve(newValue);
                    });
                }
                return loading.promise;
            };

            var filterOut = function (original, toFilter) {
                var filtered = [];
                angular.forEach(original, function (entity) {
                    var match = false;
                    for (var i = 0; i < toFilter.length; i++) {
                        if (toFilter[i][attrs.displayAttr] == entity[attrs.displayAttr]) {
                            match = true;
                            break;
                        }
                    }
                    if (!match) {
                        filtered.push(entity);
                    }
                });
                return filtered;
            };

            scope.refreshAvailable = function () {
                scope.available = filterOut(scope.available, scope.model);
                scope.selected.available = [];
                scope.selected.current = [];
            };

            scope.add = function () {
                scope.model = scope.model.concat(scope.selected.available);
                scope.refreshAvailable();
            };
            scope.remove = function () {
                scope.available = scope.available.concat(scope.selected.current);
                scope.model = filterOut(scope.model, scope.selected.current);
                scope.refreshAvailable();
            };

            $q.all([dataLoading("model"), dataLoading("available")]).then(function (results) {
                scope.refreshAvailable();
            });
        }
    };

})

我很确定您在创建模式而不是mainController时需要引用modalInstanceController。

$scope.open = function (users, dept) {
        var modalInstance = $modal.open({
            templateUrl: 'myModalContent.html',
            controller: 'ModalInstanceCtrl',
            resolve: {
                usersInModalScope: function () {
                    return users;
                },
                deptInModalScope: function () {
                    return dept;
                }
            }
        });
    };

而且您还需要将解析度传递到控制器的参数中,$ modalInstance服务也是方法关闭,关闭等活动的地方。

commonApp.controller('ModalInstanceCtrl', function ($scope, $rootScope, $modalInstance, usersInModalScope, deptInModalScope) {
    $scope.cancel = function () {
        $modalInstance.close();
    }

    $scope.save = function () {
        alert(JSON.stringify($scope.selectedUsers));
    }
});

现在说了这一点,我无法让您的实现按您想要的方式工作。 但是在ui.bootstrap和模式的实现中,我们使用了此版本。

产品Ctrl

angular.module('app', ['ui.bootstrap'])

.controller('AppController', function($scope, $modal, $templateCache) {

  $scope.product = { product: 'I am the product' };

  $scope.openEditProductModal = function () {

    var editProductModal = $modal.open({
        templateUrl: 'edit-product.html',
        controller: 'EditProductModalController',
        resolve: {
            product: function () {
                return $scope.product;
            }
        }
    });

    editProductModal.result.then(function (product) {
        $scope.product = product;
    });
  };


})

模态控制器

.controller('EditProductModalController', function ($scope, $modalInstance, product) {

   $scope.product = product;

   $scope.ok = function () {
            /**
             * Set the edited description and close the modal resolving the promise
             */
            $scope.product = product
            $modalInstance.close($scope.product);
        };

        $scope.cancel = function () {
            $modalInstance.dismiss('cancel');
        };

    })

的HTML

  <body ng-controller="AppController">
      <h1 ng-bind="product.product"></h1>
      <br>
      <button ng-click="openEditProductModal(product.product)">Open Modal</button>
      <br>
      <span ng-bind="product.product"></span>
  </body>

Edit-Product.html

<div class="modal-header">
  <h3><span class="glyphicon glyphicon-edit"></span> Edit Product</h3>
  <span class="subtitle" ng-bind="product.name"></span>
</div>
<div class="modal-body edit-description-modal">
  <div class="row">
    <input ng-model="product.product"/>
  </div>

</div>
<div class="modal-footer">
  <button class="btn btn-primary" ng-click="ok()">Save</button>
  <button class="btn btn-warning" ng-click="cancel()">Cancel</button>
</div>

链接到Plunkr

这里

工作演示$ rootScope

工作演示工厂版本

控制器范围的问题。mainController和ModalInstanceCtrl有自己的范围。 它不是完全相同的作用域实例,所以这里$ rootScope是整个应用程序中的相同实例。

我正在使用$ rootScope变量进行第一个工作演示。 取决于全局对象的确是糟糕的设计。

要在控制器之间进行通信,您需要创建factory service例如userFactory),然后传递控制器。 在工厂服务中,请保持模态。

var app = angular.module('mainApp', ['commonApp', 'ui.bootstrap']);

app.controller('mainController', function ($scope, $rootScope, $modal, $log, userFactory) {

    $scope.users = userFactory.users;

    $scope.selectedUsers = userFactory.selectedUsers;        

    $scope.open = function (users, dept) {       

        userFactory.modalInstance = $modal.open({
            templateUrl: 'myModalContent.html',
            controller: 'mainController',
            resolve: {
                usersInModalScope: function () {
                    return userFactory.users;
                },
                deptInModalScope: function () {
                    return userFactory.dept;
                }
            }
        });
    };

});

app.factory('userFactory', function (){
    return {
        modalInstance:{},
        users : [{
                    userId: 1,
                    userName: "Jhonny"
                 },
                 {
                    userId: 2,
                    userName: "Sunny"
                 }
                ],

        selectedUsers :{users: []},
        dept : [],
    }
});



var commonApp = angular.module('commonApp', ['ui.bootstrap']);

commonApp.controller('ModalInstanceCtrl', function ($scope, $rootScope, userFactory) {

    $scope.cancel = function () {
        userFactory.modalInstance.close();
        if ($rootScope.$root.$$phase != '$apply' && $rootScope.$root.$$phase != '$digest') {
            $rootScope.$apply();
        }
    }

    $scope.save = function () {
        alert(JSON.stringify(userFactory.selectedUsers));
    }
});


commonApp.directive('multiSelect', function ($q) {
    return {
        restrict: 'E',
        controller: "ModalInstanceCtrl",
        require: 'ngModel',
        scope: {
            selectedLabel: "@",
            availableLabel: "@",
            displayAttr: "@",
            available: "=",
            model: "=ngModel",
            eventHandler: '&ngClick'
        },
        template: '<div class="multiSelect">' +
            '<div class="select">' +
            '<label class="control-label" for="multiSelectAvailable">{{ availableLabel }} ' +
            '({{ available.length }})</label>' +
            '<select id="multiSelectAvailable" ng-model="selected.available" multiple ' +
            'ng-options="e as e[displayAttr] for e in available"></select>' +
            '</div>' +
            '<div class="select buttons">' +
            '<button class="btn mover right" ng-click="add()" title="Add selected" ' +
            'ng-disabled="selected.available.length == 0">' +
            '<i class=" icon-arrow-right"></i>' +
            '</button>' +
            '<button class="btn mover left" ng-click="remove()" title="Remove selected" ' +
            'ng-disabled="selected.current.length == 0">' +
            '<i class="icon-arrow-left"></i>' +
            '</button>' +
            '</div>' +
            '<div class="select">' +
            '<label class="control-label" for="multiSelectSelected">{{ selectedLabel }} ' +
            '({{ model.length }})</label>' +
            '<select id="currentRoles" ng-model="selected.current" multiple ' +
            'class="pull-left" ng-options="e as e[displayAttr] for e in model">' +
            '</select>' +
            '</div>' +
            '</div>' +
            '<div class="wrapper text-center">' +
            '<button class="btn btn-default" ng-click="save()"> Save </button>' +
            '<button class="btn btn-default" ng-click="cancel()">Cancel</button>' +
            '</div>',
        link: function (scope, elm, attrs) {
            scope.selected = {
                available: [],
                current: []
            };

            var dataLoading = function (scopeAttr) {
                var loading = $q.defer();
                if (scope[scopeAttr]) {
                    loading.resolve(scope[scopeAttr]);
                } else {
                    scope.$watch(scopeAttr, function (newValue, oldValue) {
                        if (newValue !== undefined) loading.resolve(newValue);
                    });
                }
                return loading.promise;
            };

            var filterOut = function (original, toFilter) {
                var filtered = [];
                angular.forEach(original, function (entity) {
                    var match = false;
                    for (var i = 0; i < toFilter.length; i++) {
                        if (toFilter[i][attrs.displayAttr] == entity[attrs.displayAttr]) {
                            match = true;
                            break;
                        }
                    }
                    if (!match) {
                        filtered.push(entity);
                    }
                });
                return filtered;
            };

            scope.refreshAvailable = function () {
                scope.available = filterOut(scope.available, scope.model);
                scope.selected.available = [];
                scope.selected.current = [];
            };

            scope.add = function () {
                scope.model = scope.model.concat(scope.selected.available);
                scope.refreshAvailable();
            };
            scope.remove = function () {
                scope.available = scope.available.concat(scope.selected.current);
                scope.model = filterOut(scope.model, scope.selected.current);
                scope.refreshAvailable();
            };

            $q.all([dataLoading("model"), dataLoading("available")]).then(function (results) {
                scope.refreshAvailable();
            });
        }
    };
})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM