위 처럼 말이죠. 이 상태에서 $.getUrlVar('MarketTypeCode') 메서드를 호출하면 3 이라는 값만 떨어 집니다.
위 플러그인의 코드를 보시면 알겠지만 그냥 대입해버리기 때문에 마지막꺼만 전달됩니다.
그래서 조금 수정을 해보았습니다.
getUrlVars: function () {
var vars = [], hash;
var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
for (var i = 0; i < hashes.length; i++) {
hash = hashes[i].split('=');
var hasKey = false;
for (var j = 0; j < vars.length; j++) {
if (vars[j] == hash[0]) {
hasKey = true;
break;
}
}
if (!hasKey) {
vars.push(hash[0]);
vars[hash[0]] = hash[1];
}
else {
var arr = [];
if (typeof (vars[hash[0]]) == 'string') {
arr.push(vars[hash[0]]);
}
else {
for (var k = 0; k < vars[hash[0]].length; k++) {
arr.push(vars[hash[0]][k]);
}
}
vars[hash[0]] = [];
for (var k = 0; k < arr.length; k++) {
vars[hash[0]].push(arr[k]);
}
var hasData = false;
for (var k = 0; k < vars[hash[0]].length; k++) {
if (vars[hash[0]][k] == hash[1]) {
hasData = true;
break;
}
}
if (!hasData) {
vars[hash[0]].push(hash[1]);
}
}
}
return vars;
}
위 코드는 주저리 주저리 길지만..요지는 간단합니다.
키가 존재하지 않으면 기존처럼 , 만약 키가 존재한다면 배열을 만들어서 리턴해주는 형식... 입니다.
이 수정된 플러그인으로 $.getUrlVar('MarketTypeCode') 를 호출하게 되면 [1,2,3] 으로 값이 리턴됩니다. ^^;
자 이제 이 값을 바인딩 하면 되겠습니다.
순수 jQuery로 해도 되겠고 knockoutjs 를 사용한다면 다음과 같이 하면 되겠네요.
if ($.getUrlVars()['MarketTypeCode']) {
var arr = $.getUrlVars()['MarketTypeCode'];
for (var i = 0; i < arr.length; i++) {
viewModel.MarketTypeCode.push(arr[i]);
}
}
상식적으로 볼때 루프문 안에 있기 때문에 루프 안에서 선언된 변수의 수명은 그 루프의 안에서만 유효합니다.
그런데 이놈은 그렇지 않더라고요.
아래 예제를 봅시당.
DECLARE @Index int
DECLARE @Cnt int
DECLARE @TMP TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, UserId uniqueIdentifier, Role varchar(512))
INSERT INTO @TMP
SELECT UserId, '' FROM SstUser
SET @Cnt = @@ROWCOUNT
SET @Index = 1
WHILE @Index <= @Cnt
BEGIN
DECLARE @UserId uniqueIdentifier
SELECT @UserId = UserId FROM @TMP WHERE ID = @Index
DECLARE @I INT
DECLARE @C INT
DECLARE @R VARCHAR(128)
DECLARE @T TABLE (Id int IDENTITY(1,1) PRIMARY KEY, RoleName varchar(128))
INSERT INTO @T
SELECT B.RoleName FROM AccountsUsersInRoles A
JOIN AccountsRoles B ON A.RoleId = B.RoleId
WHERE UserId = @UserId
ORDER BY RoleName
SET @C = @@ROWCOUNT
SET @I = 1
SET @R = ''
WHILE (@I < @C)
BEGIN
DECLARE @RoleName varchar(64)
SELECT @RoleName = RoleName FROM @T WHERE Id = @I
IF @R <> ''
SET @R = @R + ','
SET @R = @R + @RoleName
SET @I = @I + 1
END
UPDATE @TMP
SET Role = @R
WHERE ID = @Index
SET @Index = @Index + 1
END
SELECT A.*, b.Role FROM SstUser A JOIN @TMP B ON A.UserId = B.UserId
ORDER BY Name
END
9행에 WHILE문을 사용하고 17행을 보면 DECLARE로 테이블 변수를 while 문 내부에서 선언합니다.
이 테이블 변수 @T의 경우 While문 안에서만 유효해야 하는데 실행해 보면..계속 살아 있습니다..^^;;
identity가 적용 되어 있으므로 첫 행의 id는 1이고 다음 루프에서도 id는 1이어야 되는데..그냥 append 됩니다..
상식적으로 이해는 안되나.. 구글링 해보니..원래 그렇더군요..쿨럭..
왜 그럴까요....왜 이렇게 만들었을까요..궁금할 따름이네요..^^;
어쨋든 위 코드는 정상적으로 구동이 되지 않습니다.
아래 처럼 바꿔야 합니다.
DECLARE @Index int
DECLARE @Cnt int
DECLARE @TMP TABLE (ID INT IDENTITY(1,1) PRIMARY KEY, UserId uniqueIdentifier, Role varchar(512))
INSERT INTO @TMP
SELECT UserId, '' FROM SstUser
SET @Cnt = @@ROWCOUNT
SET @Index = 1
DECLARE @I INT
DECLARE @C INT
DECLARE @R VARCHAR(128)
DECLARE @T TABLE (Id int IDENTITY(1,1) PRIMARY KEY, RoleName varchar(128))
SET @I = 1
WHILE @Index <= @Cnt
BEGIN
DECLARE @UserId uniqueIdentifier
SELECT @UserId = UserId FROM @TMP WHERE ID = @Index
INSERT INTO @T
SELECT B.RoleName FROM AccountsUsersInRoles A
JOIN AccountsRoles B ON A.RoleId = B.RoleId
WHERE UserId = @UserId
ORDER BY RoleName
SET @C = @I + @@ROWCOUNT
SET @R = ''
WHILE (@I < @C)
BEGIN
DECLARE @RoleName varchar(64)
SELECT @RoleName = RoleName FROM @T WHERE Id = @I
IF @R <> ''
SET @R = @R + ','
SET @R = @R + @RoleName
SET @I = @I + 1
END
UPDATE @TMP
SET Role = @R
WHERE ID = @Index
SET @Index = @Index + 1
END
SELECT A.*, b.Role FROM SstUser A JOIN @TMP B ON A.UserId = B.UserId
ORDER BY Name
document에 의하면... if you want to register your own subscriptions to be notified of changes to observables, you can call their subscribe function 라고 되어 있네요..^^;
어쨋든..nweVaue에는 선택한 라디오버튼의 value값이 들어 오게 됩니다..이게 이 값으로 작업을 하시면 되겠네요..
6. foreach 문에서의 index
있을 법도 한데..없습니다.ㅡ.ㅠ;
ASP.NET MVC(Spring 에서도)에서는 컬렉션데이터를 Controller에서 받을 수 있습니다.
컬렉션을 Congroller에 넘기기 위해서는 인덱싱을 해야 합니다.
예를 들어 List<Product> 형식의 Products 속성에 바인딩을 하기 위해서는 view 단계에서
products[0].Name, products[0].Code 등등의 형식으로 표현을 해야 하지요..