2015-05-18 8 views
8

Ich habe dies:

<ng-include src="'app/components/widgets/buttonbar.html'"></ng-include> 

, dass die Tasten sowohl von der/Kunden Route und/Kunden/includes: id Routen. Ich kann Schaltflächen mit Aktionen dynamisch hinzufügen. Wenn ich an den Kunden gehe ich hinzufügen Tasten, um diese Service-Schnittstelle mit:

this.buttons = [] 
    this.addButton = function(id, title, classes, href, action, sortOrder){ 
    console.log(this.buttons) 
    var button = {}; 
    var pushViable = true; 
    button.id = id 
    button.title = title 
    button.classes = classes 
    button.href = href 
    button.action = action 
    button.sortOrder = sortOrder 
    angular.forEach(this.buttons, function(index, sort){ 
     if(button.sortOrder === sort){ 
     toastr.error('Button Sort Order Exists') 
     pushViable = false; 
     } 
    }) 
    if(pushViable === true){ 
     this.buttons.push(button) 
     this.buttons = sortButtons(this.buttons) 
     $rootScope.$broadcast('buttonBar:update') 
    } 
    } 

wie so aus meiner Kundenliste:

buttonSvc.addButton('newCustomer','New Customer', 'button small', '#','newCustomer()',0) 

$scope.newCustomer = function(){ 
    var customerModal = $modal.open({ 
    templateUrl: 'app/customers/newCustomer.html', 
    controller: 'customerModalCtrl', 
    windowClass: 'small' 
    }) 

    customerModal.result.then(function(){ 
    $rootScope.$broadcast('customer:update') 
    }) 
} 

(dabei von einem modalen arbeitet mit ui-Stiftung von pineconellc auf Github

)
buttonSvc.addButton('goBack','Go Back', 'button small', '#','toTheGrid()',2) 

Diese Taste, funktioniert jedoch nicht, mit diesem Code in der Tat:

$scope.toTheGrid = function(){ 
    $state.go('customers.list') 
    } 

Wenn ich nur einen normalen Knopf mache und die Funktion verwende, funktioniert es gut. Also habe ich ein Problem.

Da ich jetzt ein Kopfgeld gelegt habe, wenn Sie mehr Code sehen möchten, bitte fragen Sie und ich werde relevante Quellen posten.

+0

Kann das Bild nicht sehen, können Sie auch den anderen Quellcode in dieser Angelegenheit beteiligt? Danke – Renesansz

+0

[Hier ist ein Link] (https://gist.github.com/dkran/b530625ee18bc8706106) zu einem Kern, der meine Buttonbar Service Controller und Vorlage enthält, mit denen ich interagiere. Ich kann einige andere Sachen in einer Sekunde hinzufügen. Vielen Dank. – dkran

+0

Es scheint, Sie übergeben die Funktion hier als String 'buttonSvc.addButton (' goBack ',' Zurück ',' Button klein ',' # ',' toTheGrid() ', 2) 'können Sie die Single entfernen um die 'toTheGrid()' -Funktion herum und versuchen Sie es erneut?Wenn immer noch nicht funktioniert, versuche auch die Klammer '()' zu entfernen. Dann lass mich wissen, was passiert ist. Danke – Renesansz

Antwort

1

Blick auf zwei Schaltflächen:

<button ng-click="foo()">click</button> 
<button ng-click="{{'foo()'}}">click</button> 

erste Arbeit, die zweite nicht. (Generierte HTML ist das gleiche) Siehe plunk: http://plnkr.co/edit/znFa6lGUGmQ0bYw097zH?p=preview Und Grund ist einfach - im zweiten Fall wird 'foo()' nur als Basis-String betrachtet.

Also ändern Sie einfach Ihren Code, um Funktion zu addButton zu übergeben.

+0

Ich habe es versucht, aber das Problem ist der Controller für die Schaltfläche, wie https://gist.github.com/dkran/b530625ee18bc8706106 das Wesentliche, ist außerhalb des Bereichs der Schaltfläche die Funktion versuchte, die Funktion an den Dienst zu übergeben dann lass es in einem separaten Controller laufen. Kann es getan werden? Wenn Sie den gerenderten HTML-Code betrachten, handelt es sich nicht um ein String-Literal. Es ist ein tatsächlicher ng-click = "toTheGrid()", der gerendert wird. Hier ist kein String-Problem das Problem. – dkran

+0

Verlassen Sie sich nicht auf das, was Sie in HTML sehen - d. H. Gehen Sie zur Browser-Konsole und bearbeiten Sie die HTML-Schaltfläche - entfernen Sie ng-klicken Sie darauf. Die Schaltfläche funktioniert weiterhin. Das liegt daran, dass die Anweisung ng-click bereits ausgeführt wurde und click-Ereignis an bestimmte js-Funktion gebunden ist. Sie können string und dann in direct/controller make-Funktion übergeben, wie zB $ parse (functionName) ($ scope, params). –

+0

Das könnte etwas sein, was ich versuche zu tun. Ich habe den Code in meiner Codebase nicht mehr, aber ich habe im Wesentlichen versucht, die Funktion außerhalb ihrer aktuellen ui-Ansicht zu schieben, um sie zur Schaltfläche hinzuzufügen, um sie zurück zu bekommen. es war also ein Bereichsproblem, bei dem es nicht mehr innerhalb der ui-view des Controllers customerDetail.js auf die Funktion zugreifen konnte - Die Parse-Dokumentation ist praktisch null. Was tut es? – dkran

1

Ich denke, das Problem ist, dass Sie 'toTheGrid()' als String statt einer Funktion übergeben.
würde ich etwas anderes wie diese versuchen:

buttonbar.html

<div class="container"> 
    <ul class="button-group" ng-controller="buttonBar"> 
    <li ng-repeat="button in buttons track by button.sortOrder"> 
     <a href="{{button.href}}" class="{{button.classes}}" ng-click="button.action()">{{button.title}}</a> 
    </li> 
    </ul> 
</div> 

customerDetail.js

buttonSvc.addButton('goBack','Go Back', 'button small', '#', $scope.toTheGrid, 2); 
0

ich aus dem Kommentar bemerken, Sie sagten, Sie eine dynamische hatte html Tag wie folgt:

<a href="#" class="button small ng-click-active" ng-click="toTheGrid()">Go Back</a> 

Ich denke, die href kann verhindern, dass der ng-Klick hochfährt. Sie können versuchen, die href = "#" aus dem Anchor-Tag zu entfernen (standardmäßig wird preventDefault aufgerufen). Oder Sie können eine benutzerdefinierte Direktive für Attribut auf Anchor-Tag schreiben, und in der benutzerdefinierten Anweisung preventDefault() auf das Click-Ereignis aufrufen

+1

Oder Sie können die ng-klicken Sie aus, ersetzen href durch ui-sref = "customers.list" – ngunha02

+0

könnte einer der einfachsten Bandaids auf das unmittelbare Problem gewesen sein, aber es hätte nicht gelöst, was ich eigentlich versuchte mach mit dem Code. – dkran

Verwandte Themen