2015-10-10 4 views
0

Я являюсь разработчиком ядра Java, теперь начинающим изучать AngularJS. Я просматриваю страницы учебника и получил следующие сомнения.

На примера является

index.html

<div ng-app="invoice3" ng-controller="InvoiceController as invoice"> 
    <b>Invoice:</b> 
    <div> 
    Quantity: <input type="number" min="0" ng-model="invoice.qty" required > 
    </div> 
    <div> 
    Costs: <input type="number" min="0" ng-model="invoice.cost" required > 
    <select ng-model="invoice.inCurr"> 
     <option ng-repeat="c in invoice.currencies">{{c}}</option> 
    </select> 
    </div> 
    <div> 
    <b>Total:</b> 
    <span ng-repeat="c in invoice.currencies"> 
     {{invoice.total(c) | currency:c}} 
    </span> 
    <button class="btn" ng-click="invoice.pay()">Pay</button> 
    </div> 
</div> 

invoice3.js

angular.module('invoice3', ['finance3']) 
.controller('InvoiceController', ['currencyConverter', function(currencyConverter) { 
    this.qty = 1; 
    this.cost = 2; 
    this.inCurr = 'EUR'; 
    this.currencies = currencyConverter.currencies; 

    this.total = function total(outCurr) { 
    return currencyConverter.convert(this.qty * this.cost, this.inCurr, outCurr); 
    }; 
    this.pay = function pay() { 
    window.alert("Thanks!"); 
    }; 
}]); 

finance3.js

angular.module('finance3', []) 
.factory('currencyConverter', ['$http', function($http) { 
    var YAHOO_FINANCE_URL_PATTERN = 
     '//query.yahooapis.com/v1/public/yql?q=select * from '+ 
     'yahoo.finance.xchange where pair in ("PAIRS")&format=json&'+ 
     'env=store://datatables.org/alltableswithkeys&callback=JSON_CALLBACK'; 
    var currencies = ['USD', 'EUR', 'CNY']; 
    var usdToForeignRates = {}; 

    var convert = function (amount, inCurr, outCurr) { 
    return amount * usdToForeignRates[outCurr]/usdToForeignRates[inCurr]; 
    }; 

    var refresh = function() { 
    var url = YAHOO_FINANCE_URL_PATTERN. 
       replace('PAIRS', 'USD' + currencies.join('","USD')); 
    return $http.jsonp(url).success(function(data) { 
     var newUsdToForeignRates = {}; 
     angular.forEach(data.query.results.rate, function(rate) { 
     var currency = rate.id.substring(3,6); 
     newUsdToForeignRates[currency] = window.parseFloat(rate.Rate); 
     }); 
     usdToForeignRates = newUsdToForeignRates; 
    }); 
    }; 

    refresh(); 

    return { 
    currencies: currencies, 
    convert: convert, 
    refresh: refresh 
    }; 
}]); 

В finance3.js, я не знаю, когда будет вызван метод refresh(). В функции ($ http) службы 'currencyConverter' есть функция refresh() вызова. Но когда это заявление будет вызвано? Все, что я вижу, мы вызываем convert() из InvoiceController. Но нет вызовов для обновления метода.

+0

Параметр 'Refresh()' выполняется в процессе создания 'CurrencyConverter '. Затем фабрика возвращает новый объект ('currencyConverter'), который может использоваться контроллером для' convert() 'something, а также для' refresh() 'валют (что пример не делает, хотя). – venerik

ответ

0

в вашем коде 'finance3' - это не ваше имя ng-app в вашем html-коде по этой причине, я не понимаю ваш код. для получения информации о внедрении завода и его использовании я рекомендую вам внимательно прочитать это руководство. Angular Style Guide - очень хорошее руководство с примерами кода. и я рекомендую реализовать обновление в контроллере. приветствия D

+0

'finance3' - это новый модуль, который включается как зависимость в основном модуле' invoice3'. Это совершенно нормально – charlietfl

+0

заключается в том, что они не видели в html, который вы положили, я рекомендую прочитать руководство, о котором я говорил, даст вам лучшую перспективу относительно использования и распространения кода в угловом – Dairon

+0

Я рекомендую удалить вызов для обновления() Способ; в вашем заводском коде и поставить его на контроллер, чтобы запустить его, когда контроллер вызывает ваш завод по методу обновления – Dairon

0

Мысль здесь состоит в том, что нам нужно получить данные о внешней валюте при создании службы, и мы также хотим, чтобы у вас была возможность обновить эти данные в какой-то более поздней точке приложения.

Тогда имеет смысл сделать функцию refresh, которую мы будем называть один раз, когда услуга сначала вызывается, как вы заметили, позвонив по номеру refresh(). Затем мы предоставляем функцию refresh в качестве метода услуги, поэтому любой пользователь службы может запросить обновление данных службы.

0

Услуга AngularJS/завод работает так же, как Java Singleton. Поэтому, когда ваш контроллер инициализирован - код внутри

angular.module('finance3', []) 
.factory('currencyConverter', ['$http', function($http) { 

Будет выполнен. Он определяет currencies массив и 2 функции. refresh() вызывается один раз. (Вы, вероятно, предполагается запустить его позже, когда вам нужно обновить.)

Вот аналог Java этого сервиса:

public class Finance3 { 
    public static Finance3 INSTANCE = new Finance3(); 

    public String[] currencies; 
    public Map<String, String> usdToForeignRates; 

    private Finance3() { 
    refresh(); 
    } 

    private void refresh() { 
    new Thread(new Runnable(public void run() { 
     usdToForeignRates = Http.get(...) 
    })).start(); 
    } 
} 
Смежные вопросы