2014-01-18 21 views
5

sagen, dass ich eine App wie folgt schreiben:Kann ich ein Objekt in angularjs erweitern?

<script> 

myArray=<?php echo $array;?>; 
app={ 
    myArray:myArray, 
    myIndex:myArray.length-1, 
    back:function(){this.myIndex--;console.log("You clicked back");}, 
    forward:function(){this.myIndex++} 
} 
</script> 

Jetzt möchte ich eine Benutzeroberfläche hinzufügen, damit ich entscheiden AngularJS zu verwenden. Also schreibe ich dies:

<div ng-app="myApp"> 
    <div ng-controller="AppCtrl"> 
     <div ng-repeat="value in myArray | slice:myIndex:myIndex+1"> 
      <div ng-cick="back()">Back</div> 
      <div ng-bind="value"></div> 
      <div ng-cick="forward()">Forward</div> 
     </div> 
    </div> 
</div> 

Auch bekam ich diesen

var myApp=angular.module('myApp', []) 

myApp.filter('slice', function() { 
    return function(arr, start, end) { 
    return arr.slice(start, end); 
    }; 
}); 

myApp.controller("AppCtrl",function($scope){ 
    $.extend($scope,app); 
}) 

Dann habe ich den Zurück-Button klicken und die Konsolenprotokolle „Sie klickte zurück“, aber der Wert nicht ändert. Warum erweitert JQuery die Arbeit in dieser Situation nicht und wie kann ich das richtig funktionieren lassen?

+0

'$ .Extend' wird gut funktionieren .. Aber ... lesen/sehen [this] (https://github.com/angular/angular.js/wiki/Understanding-Scopes). – calebboyd

+1

Warum?!? Warum stechst du uns die Augen, indem du die Leerzeichen aus deinem Code entfernst? http://static4.wikia.nocookie.net/__cb20120328010203/adventuretimewithfinnandjake/images/b/b2/My_eyes.gif – hypno7oad

+0

Wovon redest du über @ hypno7oad? –

Antwort

4

$.extend wird gut funktionieren .. Aber .. Sie brauchen es nicht wirklich .. lesen/sehen this.

Ihr Problem zu beheben ... dies nur tun:

myApp.controller("AppCtrl",function($scope){ 
     $scope.app = app; 
    }) 

und.

<div ng-controller="AppCtrl"> 
    <div ng-repeat="value in app.myArray | slice:app.myIndex:app.myIndex+1"> 
     <button ng-click="app.back()">Back</button> 
     <div>{{value}}</div> 
     <button ng-click="app.forward()">Forward</button> 
    </div> 
    </div> 

Hoffe, dass Sie in die richtige Richtung weist.

Update

Eine Lösung wäre, den Controller, wie Syntax zu verwenden ... so

myApp.controller("AppCtrl",function(){ 
    angular.extend(this,app); 
}) 

und

<div ng-controller="AppCtrl as app"> 
    <div ng-repeat="value in app.myArray | slice:app.myIndex:app.myIndex+1"> 
     <button ng-click="app.back()">Back</button> 
     <div ng-bind="value"></div> 
     <button ng-click="app.forward()">Forward</button> 
    </div> 
    </div> 

Im ersten Beispiel $scope.app hat Kontext (weil sein der Besitzer von Forward, Back etc, die Sie gemischt haben).

+0

Danke, aber ich denke nicht, dass es so einfach ist. Das Problem ist, dass meine Funktionen das Schlüsselwort 'this' verwenden, von dem ich merke, dass es sich nicht auf den Bereich bezieht, wenn ich es erweitere ... es ist unvorhersehbar für mich, worauf' this' verweist ... es scheint sich auf den zu beziehen Controller, wenn ich mit console.log –

+0

aktualisierte Antwort testen. – calebboyd

+0

Sie gewinnen diese Runde, calebboyd ... –

Verwandte Themen