ここの角度には本当に新しいです。私はいくつかの助けが必要な問題があります。基本的には、ユーザーがクリックできるアイテムを選択する必要があります。アイテムがクリックされると、アイテムの説明などのプロパティの一部がページに表示される必要があります。最初の部分は問題ありませんが、データを表示している2番目の部分に問題があります。
フロントエンドにはが、私はそののparamaterとしてクリックitem
を取り、角NGクリックchooseItem(item)
機能を持っています:だから、ここで私が持っているものである。これは、その後items
工場に渡され
<div ng-repeat="item in items" class="col-xs-2 col-md-1">
<div ng-click="chooseItem(item)" class="thumbnail">
<img src="/images/items/{{item.name}}.png"/>
</div>
</div>
items.getChosenItemData(item)
機能を介して。実アイテムデータはMongoに保存され、ファクトリには保存されないため、この関数はdbにクエリしてアイテムデータを取得します。この取り出されたデータは、chosenItem
オブジェクトに格納され、その後、$scope.chosenItem
としてコントローラに戻されます。
app.factory('items', ['$http', function($http){
var objects = {
items: [
// ... more items before these
{name: "Pencil"},
{name: "Pen"}
/* I use these item objects as keys to the items themselves.
The ng-repeat iterates through all of the names for each item
which allows me to display static images for each item to the page.
There aren't many items, about 100, but they have tons of json information
so to hardcode it all into here is not an option
A way to do this without any hardcoding would be nice! */
// more items after these
],
// this is used to store a currently clicked item's values
chosenItem: null
}
objects.getChosenItemData = function(name){
return $http.get('/items/' + name).success(function(data){
// console.log(data);
angular.copy(data, objects.chosenItem);
console.log("Chosen Item: ", objects.chosenItem);
})
}
return objects
}]);
app.controller('MainCtrl', [
'$scope',
'items',
function($scope, items){
$scope.items = items.items;
$scope.chosenItem = null;
$scope.chooseItem = function(item){
items.getChosenItemData(item.name);
$scope.chosenItem = items.chosenItem; //chosen item object attribute in factory
console.log("$scope item: ", $scope.chosenItem);
}
}
});
これはほとんどすべての作品です。私はクリックされたアイテムのデータを正常にクエリすることができますが、それを返すことは別の話です。最初のクリックで、$scope.chosenItem
の値はnull
です。次に、2回目のクリック時に、クリックアイテムの値が保存されます。これはまた、n
個のアイテムをクリックすると、現在のアイテムではなく、n-1
アイテムの値が常に格納されるという問題を引き起こします。最初のクリックにはクリックされたアイテムの値を格納する必要があります。
私はここにどこかでコールバックを追加する必要があると感じていますが、私はAngular/JSを初めて使っているので、どこに行くべきか分かりません。
ありがとうございました!また、角のあるデザインパターンのヒントやリードは、これが非常に単純なようなものの恐ろしい実装であるという気持ちがあるので、大変感謝しています。
$scope.serviceItem = items;
をして、あなたはそのようなビューでそれを呼び出すことができます:
こんにちは、一般的に、あなたは、コードを追跡することは非常に困難であるbecaseより良い命名規則を適用する必要があります。また、コードをテストするための非常に参考になるだろうか。 – thegio
私は、いくつかの簡単な変更を参照してください。うまくいけばそれは物事をクリアする。 – tear728
注意 'success'は非難されましたが、ここで' then'を使用して実際に値を返した場合、あなたのコントローラには 'items'.getChosenItemData(item.name).then(function(returnedValue){ $ scope.item = returnedValue}) 'となります。あなたはサービスから約束を返すので、それをあなたのコントローラーの中でさらにチェーンする必要があります。 – Dan