2016-08-11 1 views
3

Ich benutze linq.js in AngularJs, ich benutze es an vielen Orten und es funktioniert gut jetzt habe ich an verschiedenen Orten verwendet und es funktioniert nicht für mich. Nicht arbeiten bedeutet, dass ich nicht das gewünschte Ergebnis erziele. Es zeigt immer {}. schau bitte unter Code, wenn ich etwas falsch mache.Angular.js linq.js Wo Filter nicht richtig funktioniert

var app = angular.module('testApp', ['angular.filter', 'angular-linq', 'ngSelect2']); 
    app.controller('testController', function ($scope, $http, $timeout, $q, $linq){ 
    $scope.Vendors = 
    [ 
     {VendorId:"VND001", VendorName:"Pharma Plus Pharmacy", Address:"Bahawalpur"}, 
     {VendorId:"VND001", VendorName:"Pakistan Pharma", Address:"Bahawalpur"} 
    ]; 
    $scope.InvoiceItems = 
    [ 
    { 
     VendorId:"VND001", 
     ItemName:"Gold Set Jewellery", 
     ItemDesc:"Some Description", 
     Cost:280.50, 
     Quantity:50 
    }, 
    { 
     VendorId:"VND001", 
     ItemName:"First Class HandWatch", 
     ItemDesc:"Some Description", 
     Cost:100.50, 
     Quantity:50 
    }, 
    { 
     VendorId:"VND002", 
     ItemName:"Gold Set Jewellery", 
     ItemDesc:"Some Description", 
     Cost:280.50, 
     Quantity:50 
    }, 
    { 
     VendorId:"VND002", 
     ItemName:"First Class HandWatch", 
     ItemDesc:"Some Description", 
     Cost:100.50, 
     Quantity:50 
    }, 
    ]; 
    $scope.totalAmount = function(vendorId){ 
     return $linq.Enumerable().From($scope.InvoiceItems).Where("x => x.VendorId =="+vendorId).Select(function(x){ 
      return (+x.Cost)*x.Quantity; 
     }).Sum(); 
    } 
    } 
} 

Bitte schauen Sie unter html

<div class="row" ng-app="testApp"> 
    <div class="col-xs-12" ng-controller="testController" ng-init="initializeDefault()"> 
    <div ng-repeat="v in Vendors"> 
     <div>{{ v.VendorId }}</div> 
     <div>{{ v.VendorName }}</div> 
     <div>{{ v.Address }}</div> 
     <div>{{ totalAmount(v.VendorId) }}</div> 
    </div> 
    </div> 
</div> 

Prompt Antwort geschätzt wird.

Antwort

2

Das erste Problem, das ich sehe, ist, dass Ihr Prädikat in der Where-Klausel falsch ist.

Die x.VendorId ist eine Zeichenfolge und Sie versuchen, es mit dem in vendorId übergebenen zu vergleichen. Aber das Lambda, das Sie erzeugen, ist effektiv:

x => x.VendorId ==VND001 

die würde keine Ergebnisse liefern.

Stattdessen müssen Sie generieren:

x => x.VendorId == 'VND001' 

Ihre Anfrage sein sollte (die kompaktere Lambda-Syntax):

$linq.Enumerable().From($scope.InvoiceItems) 
    .Where("$.VendorId == '" + vendorId + "'") 
    .Select("+$.Cost * $.Quantity") 
    .Sum(); 

Allerdings wäre es besser, wenn Sie diese Abfragen kombiniert up Front und fügen Sie die Gesamtsumme als Teil der Abfrage ein, anstatt eine separate Summe. Sie müssen die beiden Arrays verbinden.

$scope._vendors = ...; 
$scope._invoiceItems = ...; 
$scope.VendorQuery = function() { 
    return $linq.Enumerable().From($scope._vendors) 
     .GroupJoin($scope._invoiceItems, "$.VendorId", "$.VendorId", 
      "{ Id: $.VendorId, Name: $.VendorName, Address: $.Address, " 
      + "Total: $$.Sum('+$.Cost * $.Quantity') }") 
     .ToArray(); 
} 

Dann zu Ihrer Ansicht binden:

<div ng-repeat="v in VendorQuery()"> 
    <div>{{ v.Id }}</div> 
    <div>{{ v.Name }}</div> 
    <div>{{ v.Address }}</div> 
    <div>{{ v.Total }}</div> 
</div> 
+0

Danke, arbeitet jetzt perfekt. –

+0

guter Fang Jeff. upvoted :) –