2013-08-07 2 views
0

녹아웃, 바람을 이용하여 관찰 어레이 검색 I가, Durandal

var prices = ko.observableArray(); 
(Durandal의 활성화() 함수에서의)보기가 활성화 될 때 바람을 이용한 WebAPI로부터 데이터를 취득 다음 관찰 어레이

가격 클래스에는 ID, 이름 및 가격이라는 세 가지 속성이 있습니다. 나는 할 수 있도록하려면 어떻게해야 getPrice (이름) 함수는 매개 변수로 전달 된 이름을 가진 개체를 얻을 무엇

var services = [{ 
    active: true, 
    name: 'Service1', 
    price: getPrice('Service1') 
}, { 
    active: true, 
    name: 'Service2', 
    price: getPrice('Service2') 
}]; 

...

:

나는 다음 배열을 하여 뷰에서 다음을 수행 :

<div class="services"> 
    <ul data-bind="foreach: services"> 
     <li data-bind="visible: active, text: name + ' ($' + price.price + ')'"></li> 
    </ul> 
</div> 

를 I에 유래에 많이 검색하고 여러 가지 방법으로이 작업을 수행하려고했지만 그것이 작동되도록 할 수 없었다했습니다. ko.utils.arrayFirst(), ko.computed() 또는 내가해야 할 일을 사용해야하는지 잘 모르겠습니다. 성공하지 못한 채 많은 방법을 시도했습니다.

답변

2

업데이트를 참조하십시오 나는 사람이 건너 오는 경우 의견 MrYellow에서이 대답을 추가 할 거라고 생각. 이 관측 배열이 아니기 때문에

원래

results = ko.utils.arrayMap(inputs, function(item) { return new ModelFoo(item); }); 

당신은 당신의보기에서 해당 데이터를 사용할 수 없으며 속성을 관찰 할 수 있습니다.

var services = ko.observableArray([{ 
    active: ko.observable(true), 
    name: ko.observable('Service1'), 
    // Option 1 
    price: ko.observable(getPrice('Service1')) 
}, { 
    active: ko.observable(true), 
    name: ko.observable('Service2'), 
    // Option 2 
    price: ko.computed(getPrice(name())) 
}]); 

이것은보기에 효과적입니다. Breeze로이 작업을 수행하려는 경우 문제가 발생하지 않는 한 이미 관찰 가능해야합니다.이 시점에서 좀 더 많은 코드가 필요합니다.

당신이 가격을 통해 반복과 서비스를 확인하려면

은 다음과 같이 그것을 -

var services = ko.observableArray(); 
ko.utils.arrayForEach(prices(), function (price) { 
    services.push(new service(price.active(), price.name(), price.price()); 
}); 

모델 어딘가에 당신이 만들려고하면 왜이

function service(active, name, price) { 
    var self = this; 
    self.active = ko.observable(active); 
    self.name = ko.observable(name); 
    self.price = ko.computed(getPrice(name)); 
} 

이유처럼 새로운 Knockout Objects (Observable)를 사용하면 Breeze 결과를 반복하여 만들어야합니다. 표시된 것과 같은 모델 유형을 사용하면 효율적이고 범위 내의 모든 것을 유지할 수 있습니다.

또 다른 옵션은 prices()가 price 속성 외에 원하는 모든 것을 이미 가지고 있다면 가격을 계산하기 위해 Breeze 엔티티를 반환 할 때 생성자 메서드를 만드는 것입니다.

+1

'ko.utils.arrayMap'가 더 적합 할 수 있습니다. – MrYellow

+0

네, 아마도 돌아가서 업데이트해야 할 몇 가지 예전 답변이있을 것입니다. :) 대개 나는 것들을 업데이트하려고합니다. (예를 들어, 내가 할 수있는 한 여전히 많은 트래픽을 얻는다. –

1

당신은 바로 업 JS를 사용하여이 작업을 수행 할 수 있습니다

var getPrice = function(name) { 

    var matches = prices().filter(function(x) { return x.name == name; }); 

    if(matches.length == 0) return null; 

    return matches[0].price; 
}; 

주 그것이 KO 관찰 배열이 아닌 일반 배열이기 때문에이 prices().filter을한다.

+0

감사합니다. getPrices (name) 함수가 실행될 때 가격 목록이 여전히로드되지 않습니다. (거의 모든 것을 시도했을 때 나에게도 일어난 문제입니다.) Chrome을 실행할 때 개발자 콘솔, prices() 배열이 비어 있음을 알 수 있습니다. (Object [0]) ... –

+0

'ko.utils.arrayFilter'도 사용할 수 있습니다. – MrYellow