2

状態パラメーターのコントローラーにアクセスするのに問題があります。次のビューにリンクするために正しい状態を使用しています。

 <td><a ui-sref="orders({customerId: cust.id})">View Orders</a></td>

私の設定ファイルでは、名前とルート パラメータの状態を参照しています。とりあえず解決オブジェクトをコメントアウトしました。私の目標は、コントローラーに入り、正しいデータを渡すことです。 controllerAs を使用していることに注意してください

私の最初の考えは({customerId: ctrl.cust.id }) でしたが、それは URL ルートを変更しませんでした。URL は URL 名に一致するように変更されていますが、コントローラーに接続されておらず、ビューが表示されません。

    (function() {
        'use strict';

        angular
            .module('app.orders')
            .config(config);

        function config($stateProvider) {
            $stateProvider
                .state('orders',{
                    // params: {customerid: null},
                    url:'/customers:customerId', 
                    templateUrl: './components/orders/orders.html',
                    controller: 'OrdersController',
                    controllerAs: 'ctrl',
                    resolve: {
                    customerFactory: 'customerFactory',
                    customerInfo: function( customerFactory, $stateParams) {
                    return customerFactory.getCustomers($stateParams.id);
                }

            }

************** 私の主な問題は解決です。これは、次のコントローラーに入るのを妨げています。****************

                    resolve: {
                        customerId:[ '$stateParams','customerFactory', function( $stateParams, customerFactory) {
                             return customerFactory.getCustomers($stateParams.id);
                         }]
                     }
            })
        };
})();

今のところ、私のコントローラーは非常に小さいです。私はそれに接続したいだけです。ネットワーク タブを確認したところ、ファイルの GETが表示されました。

  (function() {
    // 'use strict';
    angular
        .module('app.orders')
        .controller('OrdersController', OrdersController);

    function OrdersController($stateParams) {
        console.log('in');
            var vm = this;
            vm.title = "Customer Orders";
            vm.customer = null;
    }
}());

メインの JavaScript ファイルでモジュールを参照しました。

   (function () {
    'use strict';

    angular.module('app', ['app.services',
        'app.customers',
        'app.orders','ui.router']);
})();

解決をコメントアウトすると、コントローラーにアクセスできます。だから私は問題が解決されていることを知っています。これが私のサービスです。$http リクエストを使用して.thenを使用して Json ファイルにリクエストを送信しています

更新 これはリファクタリングされたサービス コールで、毎回コンソールに正しい顧客が表示されます。

  (function() {
    angular
        .module('app.services',[])
        .constant('_', window._)
        .factory('customersFactory', customersFactory);

    function customersFactory($http, $log) {

        return {
            getCustomers: getCustomers,
            getCustomer: getCustomer
        };
        function getCustomers(){
            return $http.get('./Services/customers.json',{catch: true})
                .then(getCustomerListComplete)
                .catch(getCustomerListFailed);

                function getCustomerListComplete(response) {
                    console.log('response.data',response.data);
                    return response.data;
                }

                function getCustomerListFailed(error) {
                    console.log('error', error);
                }
        }

        function getCustomer(id) {
            var url = './Services/customers.json';
            return $http.get(url, {
                catch: true
            })
            .then(function(response) {
                console.log('promise id',id);
                var data = response.data;
                for(var i =0, len=data.length;i<len;i++) {
                    console.log('data[i].id',data[i].id);
                    if(data[i].id === parseInt(id)) {
                        console.log('data[i]', data[i]);
                        return data[i];
                    }
                }
            })
        }
    }
}());
4

2 に答える 2

1

したがって、私の以前の回答は解決なしで状態を機能させることでしたが、ここでは、解決が機能するようにするためのいくつかの調整 (および 1 つの修正) を観察します。

動作する plunkerがあり、前のものを拡張します。

修理

唯一の修正であり、最も重要な変更は次の定義によるものです。

angular
    .module('app.services',[])
    .factory('customersFactory', customersFactory);

工場名の複数形「顧客工場」を参照してください。ここにいる間:

...私の主な問題は解決です。これは、次のコントローラーに入るのを妨げています。...

resolve: {
  customerId:[ '$stateParams','customerFactory', function( $stateParams, customerFactory) {
    return customerFactory.getCustomers($stateParams.id);
  }]
}

we ask for 'customerFactory'(単数形、s途中ではない)

いくつかの改善:

したがって、これが調整後の状態定義になります。

$stateProvider
    .state('orders',{
        // INTEGER is here used to later easily use LO_DASH
        url:'/customers{customerId:int}', // int is the type
        templateUrl: './components/orders/orders.html',
        controller: 'OrdersController',
        controllerAs: 'ctrl',
        resolve: {
          // wrong name with 's'
          //customerId:[ '$stateParams','customerFactory', 
          // we use customer, because we also changed the factory 
          // implementation - to return customer related to 
          // $statePrams.customerId
          customer:[ '$stateParams','customersFactory', 
            function( $stateParams, customersFactory) {
              return customersFactory
                //.getCustomers($stateParams.id)
                .getCustomer($stateParams.customerId)
                ;
            }]
          }
})

さて、これが私たちの調整された工場であり、その新しい方法ですgetCustomer

angular
  .module('app.services', [])
  .factory('customersFactory', customersFactory);

customersFactory.$inject = ['$http', '$log', '$q', '$stateParams'];

function customersFactory($http, $log, $q, $stateParams) {

  return {
    getCustomers: getCustomers,
    getCustomer: getCustomer
  };

  function getCustomers() {
    // see plunker for this, or above in question
  }

  // new function
  function getCustomer(id) {
    var url = "customer.data.json";
    return $http
      .get(url, {
        catch: true
      })
      .then(function(response){
        var data = response.data;
        var customer = _.find(data, {"id" : id});
        return customer;
      })
      ;
  }
}

これは私たちの data.json です:

[
  {
    "id" : 1, "name": "Abc", "Code" : "N1"
  },
  {
    "id" : 2, "name": "Def", "Code" : "N22"
  },
  {
    "id" : 3, "name": "Yyz", "Code" : "N333"
  }
] 

そしてここにコントローラーがあります:

OrdersController.$inject = ['$stateParams', 'customer'];
function OrdersController($stateParams, customer) {
    console.log('in');
        var vm = this;
        vm.title = "Customer Orders " + $stateParams.customerId;
        vm.customer = customer;
}

顧客に表示するビュー

<h3>customer</h3>
<pre>{{ctrl.customer | json}}</pre>

動作確認はこちら

于 2015-09-13T15:19:33.370 に答える