javascript - AngularJS - 函数永远无法获得控制

标签 javascript angularjs angularjs-directive autocomplete angularjs-scope

首先真心希望大家能够理解和包容。这个问题非常具体,所以请不要再激进、投反对票、搁置或滥用。我们来这里是为了学习新东西并分享知识,而不是侵略。非常感谢。

问题:我正在尝试遵循 this example但函数 newState 在 the link 中工作时似乎无法获得控制。谁能确切地告诉为什么这种情况不会发生?

<!DOCTYPE html>
<html ng-app="myapp">
    <head>
    <!--[if IE]>
        <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
      <![endif]-->
    <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/angular_material/1.0.0/angular-material.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-animate.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-aria.min.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular-messages.min.js"></script>

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

    <script type="text/javascript">

          angular
              .module('myapp', ['ngMaterial'])
              .controller('DemoCtrl', DemoCtrl);

          function DemoCtrl ($timeout, $q, $log) {
            var self = this;
            self.simulateQuery = false;
            self.isDisabled    = false;
            // list of `state` value/display objects
            self.states        = loadAll();
            self.querySearch   = querySearch;
            self.selectedItemChange = selectedItemChange;
            self.searchTextChange   = searchTextChange;
            self.newState = newState;
            function newState(state) {
              alert("Sorry! You'll need to create a Constituion 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;
              }
            }
            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() {
              var allStates = 'Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware,\
                      Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana,\
                      Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana,\
                      Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina,\
                      North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina,\
                      South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia,\
                      Wisconsin, Wyoming';
              return allStates.split(/, +/g).map( function (state) {
                return {
                  value: state.toLowerCase(),
                  display: state
                };
              });
            }
            /**
             * 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);
              };
            }
          }

    </script>
    <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="style.css">
    </head>

    <body>
    <div ng-controller="DemoCtrl as ctrl" layout="column" ng-cloak>
      <md-content class="md-padding">
        <form ng-submit="$event.preventDefault()">
          <p>Use <code>md-autocomplete</code> to search for matches from local or remote data sources.</p>
          <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="What is your favorite US 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/>
          <md-checkbox ng-model="ctrl.simulateQuery">Simulate query for results?</md-checkbox>
          <md-checkbox ng-model="ctrl.noCache">Disable caching of queries?</md-checkbox>
          <md-checkbox ng-model="ctrl.isDisabled">Disable the input?</md-checkbox>
          <p>By default, <code>md-autocomplete</code> will cache results when performing a query.  After the initial call is performed, it will use the cached results to eliminate unnecessary server requests or lookup logic. This can be disabled above.</p>
        </form>
      </md-content>
    </div>

    </body>
</html>

最佳答案

奇怪,不完全确定问题是什么,但简单地将 Angular Material 版本从 1.0.0 更新到 1.0.6 似乎就为我解决了这个问题。尽管现在我已经收到一些关于 $apply 的异常。 编辑: $apply 已经在进行中似乎只发生在 Firefox 上,chrome 就很好。

关于javascript - AngularJS - 函数永远无法获得控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35895223/

相关文章:

angularjs - 为什么 ng-style 不适用于与自定义指令相同的元素?

AngularJS Group By 指令没有外部依赖

javascript - 将mapbox-style转换为openlayers 3 vectorTile样式

javascript - 如果 2 个字段的值相等,使用 Javascript 如何显示图像?

javascript - 使用 for 循环附加子元素,如果 i%3 ==0 我想在该数字的输入后添加一个 <br>

angularjs - ng-repeat 没有正确复制

javascript - 如何使用ngdialog在angularjs中实现重定向之前的消息?

php - Drupal - 我正在尝试使用 Fivestar 模块投票后刷新 View

javascript - 无法加载 ui.bootstrap 模块

javascript - AngularJS bootstrap popover with another directive Object [object Object] has no method 'popover'