2016-06-29 8 views
0

Ok, ich war mir nicht sicher, wie ich diese Frage beschreiben sollte, aber lasst es uns versuchen.

Ich habe einen Winkelregler, der abhängig von den angegebenen Werten mit verschiedenen Datenquellen arbeiten soll.

var RowCtrl = function($scope, RowService, $http, $timeout, $compile){ 
    $scope.rows = RowService.getRows(); 
    $scope.columns = RowService.getColumns(); 
    $scope.search = function() 
    ... 
    $scope.insert = function() 
    ... 
    etc... 

Die RowService hat injizierte mit Zeilen und Spalten Werte zur Verfügung gestellt wird

Es gibt auch einen MailController, die eine Form zeigt, die eine E-Mail zu senden.

In verschiedenen Seiten habe ich einen Code, der mehr oder weniger wie folgt aussieht ein:

app.controller('EmployeesController', function($scope, $controller) { 
     angular.extend(this, $controller('RowCtrl', {$scope: $scope})); 
     angular.extend(this, $controller('MailCtrl', {$scope: $scope})); 
    }); 
    app.value("rows", <?php echo json_encode($empleados); ?>); 
    app.value("columns", [ 
     {name:"id", view:false, pk:true}, 
     {name:"nombre", view:false, mandatory:true}, 
     {name:"apellidos", view:false, mandatory:true}, 
     {name:"empleado", label:"Empleado", main:true, value:function(){ return this.nombre+" "+this.apellidos; }, create:false, edit:false}, 
     {name:"email", label:"Email", click:function(row){ mailForm({toName:row.nombre+" "+row.apellidos, to:row.email }); }}, 
     {name:"telefono", label:"Teléfono"} 
    ]); 

Wenn Sie auf der „E-Mail“ Spalte sehen, habe ich einen Klick Eigenschaft, so kann ich benutzerdefinierte Ereignisse erklären auf verschiedenen Spalten.

Und das ist die Vorlage, wo es verwendet wird:

<div class = 'col' ng-repeat = 'column in columns | filter: {view:"!false", main:"!true"}'> 
    <a ng-if = 'column.click' ng-click = 'column.click(row)'>{{getCellValue(row, column)}}</a> 
    <p ng-if = '!column.click'>{{getCellValue(row, column)}}</p> 
</div> 

Also, es funktioniert so lange habe ich ein Mailformular Funktion definiert, aber was würde ich ist es vorziehen, die MailCtrl kümmern, dies haben Betrieb, so stellt sich die Frage, gibt es eine Weise, die ich so etwas tun kann (Bezug nehmend auf den aktuellen Bereich, wenn die Funktion aufgerufen wird):

... 
{name:"email", label:"Email", click:function(row){ $scopeWhereTheFunctionWasCalled.mail() }} 
... 

Vielen Dank im Voraus, und dont grausam sein, 1st eckiges Projekt :)

+0

ich verstehen mich nicht, was Du versuchst es zu tun. Können Sie diesen Code-Stift abzweigen und ein Beispiel für das Problem machen? http://codepen.io/mkl/pen/GqmKKe?editors=1010 – Michael

+0

Sicher: http://codepen.io/sergio0983/pen/OXmvBj?editors=1010 Wenn Sie auf klicken Attribut in E-Mail-Spalte, definiert es ein klicken Sie auf die Funktion für die Spalte "E-Mail" in jeder Zeile. Was ich will ist, dass ich den einen, den ich im Scope definiert habe, anrufe, aber ich weiß nicht wie das geht. – sergio0983

Antwort

1

die Funktion aufrufen, die in $scope definiert ist, müssen Sie die Funktion in den Spalten [] wie folgt definiert haben:

$scope.columns = [{ 
name: "id", 
view: false, 
pk: true, 
}, { 
name: "nombre", 
view: false, 
mandatory: true 
}, { 
name: "apellidos", 
view: false, 
mandatory: true 
}, { 
name: "empleado", 
label: "Full Name", 
main: true, 
value: function() { 
    return this.nombre + " " + this.apellidos; 
}, 
create: false, 
edit: false 
}, { 
name: "email", 
label: "Email", 
click: function(row) { 
    $scope.mailForm({ 
    toName: row.nombre + " " + row.apellidos, 
    to: row.email 
    }); 
} 
}, { 
name: "telefono", 
label: "Telephone" 
}]; 

hier ist das Arbeitsbeispiel auf codepen

+0

Ok, es ist seltsam, aber es funktioniert, solange die Spalten nicht von der Außenwelt injiziert werden. Ich muss Zeilen und Spalten an einen Service übergeben, deshalb habe ich app.value verwendet, anstatt es im Bereich zu deklarieren. Auch wenn das jetzt funktionieren wird, da ich die Spalten in der Fabrik einfach ignorieren kann (ich nehme an, sie werden sich nicht ändern), würde ich gerne wissen, ob es einen besseren Weg gibt, damit umzugehen. App.value zu verwenden, um Zeilen zu injizieren, damit ich die Factory mit vorinstallierten Zeilen deklarieren kann, scheint mir nicht sauber zu sein. – sergio0983

+0

Wenn Sie einen einfachen Codepen erstellen können, der zeigt, wie Sie wollen, dass es funktioniert, kann ich mir dieses Beispiel ansehen und kann Ihnen vielleicht helfen, das beste Muster zu bestimmen. – Michael

+0

Danke, aber ich änderte einfach den Ansatz und bekam, was ich wollte, zu viele Stunden Arbeit und ich konnte nicht sehen, dass es so einfach war wie eine setRows (datasource_name) Funktion in der Fabrik, dann kann ich App verwenden. value ("datasource", all_datasources) und tauschen Datenquellen in verschiedenen Controllern aus. Ein vollständiger Codepen würde einige weitere Anweisungen enthalten und wäre viel zu lang. Das Ziel war, einen generischen Controller zu haben, der in der Lage ist, Datensätze und Direktiven mit einem Feld zu erstellen, zu aktualisieren und zu löschen, das paginierte Datensätze anzeigen würde, und deshalb musste ich andere Datenquellen angeben – sergio0983

Verwandte Themen