【问题标题】:Accessing input field from Angular controller results in undefined从 Angular 控制器访问输入字段会导致未定义
【发布时间】:2015-12-01 16:10:58
【问题描述】:

所以我有一个搜索框,我在其中输入文本然后提交,这应该将数据发送到我的 Angular 控制器并允许我访问它,但是这样做时我只是变得不确定。

该问题是在尝试使用 $scope.searchtext 访问该字段时引起的

我的代码如下:

angular.module('starter.controllers', [])

.controller('SearchCtrl', function ($scope, $http, $ionicLoading) {

$scope.results = [];

$scope.search = function () {
    $ionicLoading.show({ template: 'Loading...' });

    $http.get('https://www.googleapis.com/youtube/v3/search?part=snippet&q=' + $scope.searchtext + '&key=').
        then(function (data) {

            var searchResults = data

            angular.forEach(searchResults.data.items, function (val, i) {

                $http.get('https://www.googleapis.com/youtube/v3/videos?part=snippet,contentDetails&id=' + val.id.videoId + '&key=').
                then(function (data) {

                    var durationResults = data
                    var duration = durationResults.data.items[0].contentDetails.duration.replace("PT", "").replace("H", ":").replace("M", ":").replace("S", "")

                    $scope.results.push({ thumbnail: val.snippet.thumbnails.medium.url, title: val.snippet.title, channel: durationResults.data.items[0].snippet.channelTitle, description: val.snippet.description, duration: duration })
                });

            });
        });

    $ionicLoading.hide();
};

})


<ion-view title="Search for Music">

    <ion-content scroll="true" class="has-header padding">

        <form ng-submit="search()" class="list list-inset">
            <label class="item item-input">
                <i class="icon ion-search placeholder-icon"></i>
                <input type="search" name="searchtext" ng-model="searchtext" placeholder="Search">
            </label>
        </form>

        <ion-list>
            <ion-item ui-sref="home" ng-repeat="result in results" class="item item-thumbnail-left">
                <img src="{{result.thumbnail}}">
                <h2>{{result.title}}</h2>
                <strong>{{result.channel}}</strong>
                <p>{{result.description}}</p>
                <p>Duration: {{result.duration}}</p>
            </ion-item>
        </ion-list>

    </ion-content>
</ion-view>

【问题讨论】:

    标签: javascript angularjs ionic-framework ionic prototypal-inheritance


    【解决方案1】:

    ion-content 确实创建了处理该 DOM 的子范围,在这种情况下,您可以使用 AngularJS Prototypal inheritance

    代码

    .directive('ionContent', [
      '$parse',
      '$timeout',
      '$ionicScrollDelegate',
      '$controller',
      '$ionicBind',
    function($parse, $timeout, $ionicScrollDelegate, $controller, $ionicBind) {
      return {
        restrict: 'E',
        replace: true,
        transclude: true,
        require: '^?ionNavView',
        scope: true, //<-- this creates a prototypically inherited scope
        template:
        '<div class="scroll-content">' +
          '<div class="scroll"></div>' +
        '</div>',
    

    在声明ng-model 时遵循点规则,例如将searchtext 定义为倾向于遵循javascript 原型的对象属性。

    标记

    <input type="search" name="searchtext" ng-model="model.searchtext" placeholder="Search">
    

    控制器

    $scope.model = {};
    

    类似SO answer这里

    【讨论】:

    • 啊,我明白了,抱歉,我是 Angular 的新手。这解决了我的问题!
    • @TomWilson np..很高兴为您提供帮助..谢谢
    【解决方案2】:

    使用也可以使用$parent来访问controller的值。

    <input type="search" name="searchtext" ng-model="$parent.searchtext" placeholder="Search"> 
    

    【讨论】:

      猜你喜欢
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      • 2013-10-27
      • 2020-09-09
      • 2015-06-25
      • 2019-05-26
      相关资源
      最近更新 更多