angularjs - Why do I need $parent to enable the function in ng-click when using ion-scroll? -


i using following versions:

  1. ionic, v1.0.0-beta.14
  2. angularjs v1.3.6

route configuration:

myapp.config(function ($stateprovider) {     $stateprovider         .state('manager_add', {             url: '/managers/add',             templateurl: 'app/components/mdl.role_members/views/add.html',             controller: 'manageraddcontroller'         }); }); 

controller configuration:

myapp.controller('manageraddcontroller', function ($scope, $state, $ionicloading, $filter, contactservice, managersservice, rolerequest, rolerequestssentservice, toastrservice) {      $scope.role_request = rolerequest.new();     $scope.showcontactsearch = false;      $scope.managers = managersservice.collection();     $scope.$watchcollection("managers", function( newmanagers, oldmanagers ) {         if(newmanagers === oldmanagers){ return; }         $scope.managers = newmanagers;         $scope.contactstobeinvited = getnotinvitedcontacts();     });      $scope.contacts = contactservice.collection();     $scope.$watchcollection("contacts", function( newcontacts, oldcontacts ) {         if(newcontacts === oldcontacts){ return; }         $scope.contacts = newcontacts;         $scope.contactstobeinvited = getnotinvitedcontacts();     });      $scope.contactstobeinvited = getnotinvitedcontacts();     function getnotinvitedcontacts() {         var notinvited = [];         angular.foreach($scope.contacts, function(contact) {             if(angular.isobject($scope.managers)) {                 var results = $filter('filter')($scope.managers, {member_id: number(contact.contact_id)}, true);                 if (results.length == 0) {                     this.push(contact);                 }             } else {                 this.push(contact);             }         }, notinvited);          return notinvited;     }      $scope.search_contact = "";     $scope.search = function(contact) {         if($scope.search_contact === "" || $scope.search_contact.length === 0) {             return true;         }          $scope.showcontactsearch = true;         var found = false;         if(contact.display_name) {             found = (contact.display_name.tolowercase().indexof($scope.search_contact.tolowercase()) > -1);             if(found) { return found; }         }         if(contact.contact.getfullname()) {             found = (contact.contact.getfullname().tolowercase().indexof($scope.search_contact.tolowercase()) > -1);             if(found) { return found; }         }         if(contact.contact.email) {             found = (contact.contact.email.tolowercase().indexof($scope.search_contact.tolowercase()) > -1);             if(found) { return found; }         }          return found;     }      $scope.selectcontact = function(contact) {         $scope.search_contact = contact.contact.getfullname();          // todo: make dynamic role         $scope.role_request.role_id = 4;         $scope.role_request.email = contact.contact.email;     };      $scope.addrolemember = function(valid) {         if($scope.role_request.email === "") { return; }         if(!valid) { return; }          $ionicloading.show({             template: 'please wait...'         });          rolerequestssentservice.add($scope.role_request).then(function(rolejsonresponse){             toastrservice.toastrsuccess('request send', 'we have send invite '+ $scope.search_contact +'.');             $ionicloading.hide();             $state.go('managers');         });     } }); 

view configuration:

<ion-view view-title="manageradd" >      <ion-content class="has-header scroll="true">         <div class="content">              <div class="list">                 <div class="item item-border">                     <p>some text</p>                 </div>             </div>               <form name="managerform">                 <div class="list">                      <div class="item item-divider">                         text                     </div>                      <div class="item item-border">                         <form name="fillform">                             <div class="form-group">                                 <label class="item item-input item-stacked-label item-textarea">                                     <span class="input-label border-none">personal message: <span class="text-red required">*</span></span>                                     <textarea name="message" ng-model="role_member.message" required></textarea>                                 </label>                                 <p ng-show="managerform.message.$dirty && managerform.message.$error.required"                                    class="error-message">message required!</p>                             </div>                              <div class="form-group">                                 <label class="item item-input">                                     <span class="input-label">search on name <span class="text-red required">*</span></span>                                     <input type="text" name="search_contact" ng-model="$parent.search_contact">                                 </label>                                  <div class="searchresultbox" ng-show="showcontactsearch">                                     <ion-scroll direction="y" class="scrollarea">                                         <div class="list">                                              <a class="item item-border item-avatar pointer" ng-repeat="contact in $parent.filteredcontacts = (contactstobeinvited | filter:search:false)" ng-click="$parent.selectcontact(contact)">                                                 <img src="{{ contact.getimage('thumbnail') }}">                                                 <h2>{{contact.geticonname()}}</h2>                                                 <p>city: {{contact.contact.city}}</p>                                             </a>                                          </div>                                     </ion-scroll>                                      <div class="notfound pointer" ng-hide="filteredcontacts.length">                                         <h3>nobody found</h3>                                         <p>you can search through existing contacts</p>                                     </div>                                  </div>                             </div>                          </form>                     </div>                 </div>                   <div class="form-actions">                     <button type="submit" class="button button-block regie-button" ng-click="addrolemember(registerform.$valid)">                         sent request                     </button>                 </div>             </form>              <p class="text-red" style="text-align:center; font-size:14px; font-weight: 400;">* required</p>          </div>     </ion-content>  </ion-view> 

as can see in view need use $parent following fields work:

  • ng-model="$parent.search_contact"
  • ng-repeat="contact in $parent.filteredcontacts = (contactstobeinvited | filter:search:false)"
  • ng-click="$parent.selectcontact(contact)"

i don't understand why necessary because complete view using same controller. have idea?

the problem inheritance. between controller's scope , fields, there several new scopes (ion-content, ion-scroll , others).

so example ng-model="search_content". when write in there, going create search_content variable inside ion-content scope (or intermediary scope if there didn't see). since search_content being created inside ion-content, controller won't see it.

if $parent.search_content create in parent content (aka controller's scope).

you shouldn't that, $parent today, tomorrow can point else (because add new scope in between without knowing $parent point ion-content.

so instead of doing that, need use objects , no primitives, example:

ng-model="form.search_contact" 

thank that, form object through prototype chain until finds on controller's scope , use (just need).

read this hundred times better explanation.


Comments

Popular posts from this blog

android - MPAndroidChart - How to add Annotations or images to the chart -

javascript - Add class to another page attribute using URL id - Jquery -

firefox - Where is 'webgl.osmesalib' parameter? -