angularJs组件和控制器

沙沙语

我已经创建了角度组件,代码如下所示:

(function () {
    'use strict';
    angular
        .module('App', ['ngMaterial']).component('autoComplete', {
            template: '<div layout="column" ng-cloak>\
                        <md-content class="md-padding">\
                            <form ng-submit="$event.preventDefault()">\
                                <md-autocomplete ng-disabled="$ctrl.isDisabled"\
                                    md-no-cache="$ctrl.noCache"\
                                    md-selected-item="$ctrl.selectedItem"\
                                    md-search-text-change="$ctrl.searchTextChange($ctrl.searchText)"\
                                    md-search-text="$ctrl.searchText"\
                                    md-selected-item-change="$ctrl.selectedItemChange(item)"\
                                    md-items="item in $ctrl.querySearch($ctrl.searchText)"\
                                    md-item-text="item.display"\
                                    md-min-length="0"\
                                    placeholder="Search State">\
                                <md-item-template>\
                                <span md-highlight-text="$ctrl.searchText" md-highlight-flags="^i">{{item.display}}</span>\
                                </md-item-template>\
                                <md-not-found>\
                                No states matching "{{$ctrl.searchText}}" were found.\
                                <a ng-click="$ctrl.newState($ctrl.searchText)">Create a new one!</a>\
                                </md-not-found>\
                                </md-autocomplete>\
                                <br />\
                            </form>\
                        </md-content>\
                    </div>',
            controller: function DemoCtrl($timeout, $q, $log, $http) {
                $log.info('Called');
                var self = this;

                self.simulateQuery = false;
                self.isDisabled = false;

                // list of `state` value/display objects
                self.states = loadAll($http);
                self.querySearch = querySearch;
                self.selectedItemChange = selectedItemChange;
                self.searchTextChange = searchTextChange;

                self.newState = newState;

                function newState(state) {
                    alert("Sorry! You'll need to create a Constitution for " + state + " first!");
                }

                // ******************************
                // Internal methods
                // ******************************

                /**
                 * Search for states... use $timeout to simulate
                 * remote dataservice call.
                 */
                function querySearch(query) {
                    //var results = query ? self.states.filter(createFilterFor(query)) : self.states,
                    //    deferred;
                    //if (self.simulateQuery) {
                    //    deferred = $q.defer();
                    //    $timeout(function () { deferred.resolve(results); }, Math.random() * 1000, false);
                    //    return deferred.promise;
                    //} else {
                    //    return results;
                    //}
                    var allStates;
                    return $http.get("/Home/GetStates", { params: { q: query } })
                    .then(function (response) {
                        allStates = response;
                        return allStates.data.split(/, +/g).map(function (state) {
                            return {
                                value: state.toLowerCase(),
                                display: state
                            };
                        });
                    })
                    //$http({
                    //    method: 'GET',
                    //    url: '/Home/GetStates'
                    //}).then(function successCallback(response) {
                    //    allStates = response;

                    //}, function errorCallback(response) {
                    //    alert(response);
                    //    return false;
                    //});
                }

                function searchTextChange(text) {
                    $log.info('Text changed to ' + text);
                }

                function selectedItemChange(item) {
                    $log.info('Item changed to ' + JSON.stringify(item));
                }

                /**
                 * Build `states` list of key/value pairs
                 */
                function loadAll($http) {
                    //var allStates;
                    //$http({
                    //    method: 'GET',
                    //    url: '/Home/GetStates'
                    //}).then(function successCallback(response) {
                    //    allStates = response;
                    //    return allStates.split(/, +/g).map(function (state) {
                    //        return {
                    //            value: state.toLowerCase(),
                    //            display: state
                    //        };
                    //    });
                    //}, function errorCallback(response) {
                    //    alert(response);
                    //    return false;
                    //});            
                }

                /**
                 * Create filter function for a query string
                 */
                function createFilterFor(query) {
                    var lowercaseQuery = angular.lowercase(query);

                    return function filterFn(state) {
                        return (state.value.indexOf(lowercaseQuery) === 0);
                    };

                }
            }
        })
})();

并且我在新的javascript文件中创建了一个控制器,它看起来如下。

(function () {
    var app = angular.module("App", []);
    var TestController = function ($scope) {
        $scope.Display = "Test Display";
    };
    app.controller("TestController", ["$scope", TestController]);
}());

这是我的HTML

<html ng-app="App" ng-cloak>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/angular.min.js"></script>
    <!-- Angular Material requires Angular.js Libraries -->
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-animate.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-aria.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.5.5/angular-messages.min.js"></script>

    <!-- Angular Material Library -->
    <script src="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.js"></script>

    <script type="text/javascript">
        /**
         * You must include the dependency on 'ngMaterial'
         */
        angular.module('App', ['ngMaterial']);
        
    </script>
    <script src="~/Scripts/TestAngular.js"></script>
    <script src="~/Scripts/Component/auto-complete.component.js"></script>
    <!-- Your application bootstrap  -->

    

    <link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/angular_material/1.1.0/angular-material.min.css">
</head>
<body>
    <div ng-controller="TestController">
        <input type="text" ng-model="Display" />
        {{Display}}
    </div>
    <auto-complete></auto-complete>
    
</body>
</html>

当试图运行此HTML时,我收到Testcontroller注册错误。但是,如果我删除了auto-complete.component.js,那么TestController可以正常工作。请帮我解决这个问题。

尤利西斯(Ulysses BN)

您正在弄乱模块声明,要么声明一次,要么正确执行。

做对了

声明模块后,即可使用

angular.module('App')

因此,在您的html文件中,没有任何变化,但是在其他两个文件中,都替换了angular.module('App',[..]) byangular.module('App')。

这是实现此目标的最佳做法,将每个组件都隔离在隔离的(function(){ .. })()块中

声明一次

对于您的问题,我通过将第一个调用脚本(在html中为内联)更改为:

var app = angular.module('App', ['ngMaterial']);

然后我使用此变量,而不是每次都重新定义一个新模块:

(function(app){
   // controller or component here
}(app));

这是成功的窍门,但是这一步是一些更复杂的模块改写此外,应避免这样的全局变量

我的TestController:

(function (app) {
    var TestController = function ($scope) {
        $scope.Display = "Test Display";
    };
    app.controller("TestController", ["$scope", TestController]);
}(app));

我的自动填充组件:

(function (app) {
    'use strict';
    app.component('autoComplete', {
      // ...
    })
})(app);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angularjs 控制器和模板封装 vs Angular 组件

来自分类Dev

具有angularJS组件1.5的组件控制器中$ element和$ attrs的用途

来自分类Dev

AngularJS指令控制器和要求

来自分类Dev

AngularJS模块和外部控制器

来自分类Dev

RequireJS和AngularJS多个控制器

来自分类Dev

AngularJS模块和外部控制器

来自分类Dev

AngularJS控制器和工厂

来自分类Dev

如何在AngularJS中实例化控制器组件?

来自分类Dev

AngularJS指令或控制器来分离视图组件

来自分类Dev

angularjs 1.5中组件控制器中的访问解析

来自分类Dev

无法在控制器中包含和使用组件的方法

来自分类Dev

Ember在视图组件和控制器之间进行通信

来自分类Dev

EmberJS关于控制器,服务和组件使用的建议

来自分类Dev

AngularJS控制器构造函数和编译器

来自分类Dev

从控制器访问组件

来自分类Dev

AngularJS,使用控制器数据和控制器数据

来自分类Dev

AngularJS-视图控制器和过滤器控制器

来自分类Dev

AngularJS:在指令和外部控制器之间共享数据

来自分类Dev

AngularJS指令控制器的语法和范围

来自分类Dev

AngularJS-单独的控制器和DOM操作

来自分类Dev

Angularjs和Asp.Net MVC控制器

来自分类Dev

在AngularJS控制器和指令中使用“ this”而不是“ scope”

来自分类Dev

AngularJS控制器继承和执行顺序

来自分类Dev

AngularJS:指令和控制器之间的链接

来自分类Dev

AngularJS:延迟加载控制器和内容

来自分类Dev

Angularjs Typescript控制器继承和依赖注入

来自分类Dev

AngularJS隔离范围和控制器绑定

来自分类Dev

运行和控制器angularjs之间的全局变量

来自分类Dev

共享变量和多个控制器AngularJS

Related 相关文章

热门标签

归档