Я сделал приложение для приема пищи, и я пытаюсь отправить результат, используя электронную почту mandrill. Я могу использовать форму ввода и отправлять электронные письма, однако я не могу привязывать и отображать отфильтрованные результаты json ng-repeat на основе выбора пользователя. Соответствующие HTML ниже:Bind and scope ng-repeat json elements
<md-card>
<md-card-content>
<h3 class="md-subhead" align="center">Review And Submit Order</h3>
<md-divider></md-divider>
<md-list ng-repeat="item in items.results | filter:true">
<md-list-item layout="row">
<h3><div style="text-align: left;" ng-bind-html="item.name"></div><span style="float: left;">Qty:{{item.qty}}</span></h3>
<span flex></span>
<h3>{{ item.price | currency }}</h3>
</md-list-item>
<md-list-item layout="row">
<span>Side: {{item.type}}</span>
</md-list-item>
<md-list-item layout="row" ng-repeat="item in item.flavors | filter:true">
<span>{{ item.name }}</span>
<span flex></span>
<span>{{ item.price | currency }}</span>
</md-list-item>
<md-list-item layout="row" ng-repeat="item in item.sizes | filter:true">
<span>{{ item.name }}</span>
<span flex></span>
<span>{{ item.price | currency }}</span>
</md-list-item>
</md-list>
<md-divider></md-divider>
<md-list>
<md-list-item layout="row">
<h3 class="md-subhead">Order Total:</h3>
<span flex></span>
<h3 ng-model="pricetotal">{{ total(items.results) | currency }}</h3>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<md-card ng-if="(items.results | filter : {active: true}).length > 0">
<md-card-content layout-padding>
<form name="order">
<md-input-container flex>
<label>Name</label>
<input ng-model="name">
</md-input-container>
<md-input-container flex>
<label>Phone</label>
<input ng-model="phone">
</md-input-container>
<md-input-container flex>
<label>Address</label>
<input ng-model="address">
</md-input-container>
<md-input-container flex>
<label>Email</label>
<input ng-model="email">
</md-input-container>
<md-input-container flex>
<label>Options</label>
<textarea ng-model="options"
columns="1"
md-maxlength="150"></textarea>
</md-input-container>
</form>
</md-card-content>
<md-card-content layout="row" layout-align="end center">
<md-button class="md-raised md-primary" ng-controller="EmailController" ng-click=sendMail()>
Place Order
</md-button>
</md-card-content>
</md-card>
Так, в принципе, я хочу, чтобы связать $ scope.menu к item.name с item.type, item.name в item.flavors и item.name в item.sizes отдельно и $ scope.total to total (items.results) отдельно. Как только я привяжу эти значения, я хочу отправить их по электронной почте через Mandrill.
Вот мой EmailController:
app.controller('EmailController', function($scope, $http, $mdToast, OrderFunctions) {
$scope.showSuccessToast = function() {
$mdToast.show({
position: "top",
template: "<md-toast style='background-color:#3F51B5;'>Your order has been sent. Thank you!</md-toast>"
});
};
$scope.showErrorToast = function() {
$mdToast.show({
position: "top",
template: "<md-toast style='background-color:#3F51B5;'>Order not sent. Please check your internet connection.</md-toast>"
});
};
$scope.total = OrderFunctions.total;
$scope.totalOrder = OrderFunctions.totalOrder;
$scope.sendMail = function() {
var mailJSON = {
"key": "XXXXXXXXXXXX", //your mandrill key goes here
"message": {
"html": "<h1>New Order</h1><p>You have received a new order from:</p><p>Name: *|NAME|*<br>Phone: *|PHONE|*<br>Address: *|ADDRESS|*<br>Email: *|EMAIL|*<br>Options: *|OPTIONS|*</p><p>They would like:</p><p>*|ITEMS|*</p><p>Order Total is: *|TOTAL|*</p>",
"merge_vars": [{
"rcpt": "[email protected]", //your email addy here
"vars": [{
"name": "NAME",
"content": $scope.name
},{
"name": "PHONE",
"content": $scope.phone
},{
"name": "ADDRESS",
"content": $scope.address
},{
"name": "EMAIL",
"content": $scope.email
},{
"name": "OPTIONS",
"content": $scope.options
},{
"name": "ITEMS",
"content": $scope.menu
},{
"name": "TOTAL",
"content": "$"+$scope.total+".00"
}]
}],
"text": "",
"subject": "New Order Received", // change subject here
"from_email": "[email protected]", //change from email here
"from_name": "Signs Restaurant", //change from name here
"to": [{
"email": "[email protected]", //your email here
"name": "New Order", //subject here
"type": "to"
}],
"merge": true,
"important": false,
"track_opens": null,
"track_clicks": null,
"auto_text": null,
"auto_html": null,
"inline_css": null,
"url_strip_qs": null,
"preserve_recipients": null,
"view_content_link": null,
"tracking_domain": null,
"signing_domain": null,
"return_path_domain": null
},
"async": false,
"ip_pool": "Main Pool"
};
var apiURL = "https://mandrillapp.com/api/1.0/messages/send.json";
$http.post(apiURL, mailJSON).
success(function(data, status, headers, config) {
$scope.showSuccessToast();
$scope.form = {}; //this clears the form after success
console.log('successful email send.');
console.log('status: ' + status);
console.log('data: ' + data);
console.log('headers: ' + headers);
console.log('config: ' + config);
}).error(function(data, status, headers, config) {
$scope.showErrorToast();
console.log('error sending email.');
console.log('status: ' + status);
});
//use these to only clear certain fields
/*
$scope.name = "";
$scope.phone = "";
$scope.address = "";
$scope.email = "";
$scope.clearCart();
*/
};
});
Я попытался следующие: я изменил этот
<md-list ng-repeat="item in items.results | filter:true">
в
<md-list ng-repeat="item in (menu = items.results | filter:true)">
в этом случае, я думаю, я бы для определения $ scope.menu, но, похоже, слишком сложно определить то же самое. Я был бы признателен за любые намеки на это. Я довольно новичок в angularjs, но сумел выяснить большинство вещей. Идея состоит в том, чтобы получить отфильтрованные данные ng-repeat json с этой страницы и отправить их по электронной почте, нажав кнопку «Разместить заказ». Заранее спасибо!
Вот plunker я работаю: http://plnkr.co/edit/4ByCDzXZfRU7kMX9oURT?p=preview JS все в index.html, EmailController начинается от линии 345. HTML в order.html
EDIT: Просто чтобы прояснить, моя проблема еще ниже, из-за того, что у меня есть функции 2 ng-repeat один ниже другого. Вот что я пробовал; мой измененный HTML:
<md-card>
<md-card-content>
<h3 class="md-subhead" align="center">Review And Submit Order</h3>
<md-divider></md-divider>
<md-list ng-repeat="item in filteredmenu = (items.results | filter:true)">
<md-list-item layout="row">
<h3><div style="text-align: left;" ng-bind-html="item.name"></div><span style="float: left;">Qty:{{item.qty}}</span></h3>
<span flex></span>
<h3>{{ item.price | currency }}</h3>
</md-list-item>
<md-list-item layout="row">
<span>Side: {{item.type}}</span>
</md-list-item>
<md-list-item layout="row" ng-repeat="item in filteredflavors = (item.flavors | filter:true)">
<span>{{ item.name }}</span>
<span flex></span>
<span>{{ item.price | currency }}</span>
</md-list-item>
<md-list-item layout="row" ng-repeat="item in filteredsizes = (item.sizes | filter:true)">
<span>{{ item.name }}</span>
<span flex></span>
<span>{{ item.price | currency }}</span>
</md-list-item>
</md-list>
<md-divider></md-divider>
<md-list>
<md-list-item layout="row">
<h3 class="md-subhead">Order Total:</h3>
<span flex></span>
<h3 ng-model="pricetotal">{{ pricetotal=(total(items.results) | currency) }}</h3>
</md-list-item>
</md-list>
</md-card-content>
</md-card>
<md-card ng-if="(items.results | filter : {active: true}).length > 0">
<md-card-content layout-padding>
<form name="order">
<md-input-container flex>
<label>Name</label>
<input ng-model="name">
</md-input-container>
<md-input-container flex>
<label>Phone</label>
<input ng-model="phone">
</md-input-container>
<md-input-container flex>
<label>Address</label>
<input ng-model="address">
</md-input-container>
<md-input-container flex>
<label>Email</label>
<input ng-model="email">
</md-input-container>
<md-input-container flex>
<label>Options</label>
<textarea ng-model="options"
columns="1"
md-maxlength="150"></textarea>
</md-input-container>
</form>
</md-card-content>
<md-card-content layout="row" layout-align="end center">
<md-button class="md-raised md-primary" ng-controller="EmailController" ng-click=sendMail()>
Place Order
</md-button>
</md-card-content>
</md-card>
Я добавил этот скрипт в мой контроллер Email:
$scope.filteredmenu = function (filteredmenu){
var order = " ";
angular.forEach(filteredmenu, function(item) {
var flavor = " ";
var size = " ";
order += item.name + ", Qty: " + item.qty + " , ";
angular.forEach(filteredflavors, function(option) {
flavor += "Flavor: " + option.name + " , ";
});
angular.forEach(filteredsizes, function(option) {
size += "Size: " + option.name + " , ";
});
menuorder += order + size + flavor;
});
return menuorder;
};
Я Абеля, чтобы получить результат за $ scope.pricetotal, но не за $ scope.filteredmenu; Что я делаю не так?
Извините, в основном вы хотите получить отфильтрованный результат в своем контроллере? –
Точно, да. Есть идеи? – user3839044