2017-07-14 181 views
0

当我在我的投资组合中选择项目时,我的路线为/portfolio/:workName。在我的控制器中,我想将$scope.work设置为基于workName选择的项目。这是我到目前为止有:在Angular Factory中获取属性元素

app.factory('Works', function(){ 

var Works = {} 

Works.projects =[ 
    { 
     name : "ProjectOne", 
     string : "stuff", 
    { 
     name : "ProjectTwo", 
     string : "more stuff", 
    }, 
    { 
     name : "ProjectThree", 
     string : "stuff", 
    } 
]; 

Works.findByName = function(name) { 
    Works.projects.forEach(function(work) { 
     if(work.name == name) { 
      return work; 
     } 
    }); 
} 
return Works; 
}) 

app.controller("ProjectController", function ($scope, Works, $routeParams) { 
$scope.work = Works.findByName($routeParams.workName); 
}); 

然而,在调试器中,尽管$routeParams.workName返回 “ProjectOne”,Works.findByName($routeParams.workName)返回undefined。

+0

你有没有打过电话的console.log()的参数名称,Works.projects和日志里面的每一个的工作。名称。也尝试使用angular.equals(work.name,name); – Matt

回答

2

的问题与你的代码是forEachnot returning a value(你是不是在findByName方法和the return value of forEach is undefined返回结果为好),而只是执行比较。您可以修改方法如下或使用filter()方法(Works.findByNameUsingFilter为例):

angular.module('myApp', []) 
 
.factory('Works', [function(){ 
 
    var Works = {}; 
 
    Works.projects = [ 
 
     { 
 
      name: "ProjectOne", 
 
      string: "stuff1" 
 
     }, 
 
     { 
 
      name : "ProjectTwo", 
 
      string : "more stuff", 
 
     }, 
 
     { 
 
      name : "ProjectThree", 
 
      string : "stuff", 
 
     } 
 
    ]; 
 

 
    Works.findByName = function(name) { 
 
     var res = ''; 
 
     Works.projects.forEach(function(work) { 
 
      if(work.name === name) { 
 
       res = work; 
 
      } 
 
     });  
 
     return res; 
 
    }; 
 
    
 
    Works.findByNameUsingFilter = function(name) { 
 
     return Works.projects.filter(function(work) { 
 
      return work.name === name; 
 
     });  
 
    }; 
 

 
    return Works; 
 
}]) 
 
.controller("ProjectController", ['$scope', 'Works', function ($scope, Works) { 
 
    $scope.workUsingFindByName = Works.findByName("ProjectOne"); 
 
    $scope.workUsingFindByNameUsingFilter = Works.findByNameUsingFilter("ProjectThree"); 
 
}]);
<script src="//code.angularjs.org/1.6.2/angular.js"></script> 
 

 
<div ng-app="myApp"> 
 
    <div ng-controller="ProjectController"> 
 
    {{workUsingFindByName.string}} 
 
    <br/> 
 
    {{workUsingFindByNameUsingFilter[0]}} 
 
    </div> 
 
</div>

+0

这样做!谢谢! – Kat

0

检查代码将Works.findByName更改为无功功能。

app.factory('Works', function(){ 

var Works = {} 

Works.projects =[ 
    { 
     name : "ProjectOne", 
     string : "stuff", 
    { 
     name : "ProjectTwo", 
     string : "more stuff", 
    }, 
    { 
     name : "ProjectThree", 
     string : "stuff", 
    } 
]; 

var findByName = function(name) { 
    Works.projects.forEach(function(work) { 
     if(work.name == name) { 
      return work; 
     } 
    }); 
} 
return {findByName: findByName}; 

}); 

app.controller("ProjectController", function ($scope, Works, $routeParams) { 
$scope.work = Works.findByName($routeParams.workName); 
}); 
1

这些都是在你的代码中的错误:在Works

  1. '{' 失踪。项目。
  2. 使用过滤器代替forEachmap
  3. 您没有正确返回值。正确的方法检查的代码片段:

var Works = {}; 
 
Works.projects =[ 
 
    { 
 
     name : "ProjectOne", 
 
     string : "stuff" 
 
    }, 
 
    { 
 
     name : "ProjectTwo", 
 
     string : "more stuff" 
 
    }, 
 
    { 
 
     name : "ProjectThree", 
 
     string : "stuff" 
 
    } 
 
]; 
 

 
Works.findByName = function(name) { 
 
    //ES5 Syntax 
 
    return Works.projects.filter(function(work) { 
 
     if(work.name == name) { 
 
      return work; 
 
     } 
 
    }); 
 
    
 
    //ES6 Syntax 
 
    //return Works.projects.filter(work => (work.name == name)); 
 
} 
 

 

 

 
console.log(Works.findByName('ProjectThree'))